[英]Runtime Datatype polymorphism
我想出了C ++中运行时多态性的解决方案。
#include <iostream>
using namespace std;
class base {
public:
virtual void call(double xx) {
cout << "DERIVED: " << xx << endl;
}
};
template<typename T>
class derivedT : base {
public:
virtual void call(double xx) {
cout << "DERIVED_T: " << ((T) xx) << endl;
}
};
int main() {
base* sample = nullptr;
cout << "CHOOSE TYPE: (BYTE = 1, UINT = 2, DOUBLE = 3)" << endl;
uint8_t type = cin.get();
type -= 48;
switch (type) {
case 1:
sample = (base*) new derivedT<uint8_t>();
break;
case 2:
sample = (base*) new derivedT<uint32_t>();
break;
case 3:
sample = (base*) new derivedT<double_t>();
break;
}
sample->call(2567.45);
cin.get();
cin.get();
}
这里的想法是,编译器将在运行时在switch语句中生成所有模板化类型。 这些模板在编译时是已知的,因此现在我们可以从基类中调用虚拟的方法,这些方法会在派生类中被覆盖。
起作用的唯一原因是因为每个类的函数具有相同的参数。 如果我们要在派生类中使用T的参数使用,那么它将不起作用。 因此,我们将参数强制转换为派生类中的T以实现所需的行为。 我注意到这仅适用于C样式转换。
如此……这是什么类型的不确定行为?
您的代码完全是100%经典多态的 ,除了一个小的错字:您已经Derived<T>
从Base
私有继承,而不是公开继承。
你写了:
template<typename T>
class derivedT : base {
// ^ bases, just like members, default to 'private'
您应该已经写过:
template<typename T>
class derivedT : public base {
// ^^^^^^
这解释了为什么必须使用“ C样式” static_cast
转换而不是简单的static_cast
从派生类获取其私有基类。 如果基础是公开的,那么static_cast
会很好地工作。 然后,您的代码就没有什么有趣的了–它只是具有基类和几个派生类的简单“经典OOP”。
即使有私有基础,我相信这也不是未定义的行为。 到您调用虚拟方法时,您肯定还可以:您拥有类型为base*
的指针,并且实际上指向了类型为base
的对象,因此您可以。 UB 可能会进入的唯一地方是您进行C样式转换...但是在这里编译器可以看到,您正在将派生类转换为它的私有基,并且可以完成该工作。 (允许C样式的强制转换绕过C ++中的访问控制,但它们仍然遵守其他规则,而不会伪造。它们不会移交给reinterpret_cast
。)
无论如何,对于CodeReview,此问题似乎是题外话。 您应该做的是将主题行发布到StackOverflow,主题行为“在将指针指向Base
的指针转换为Derived
指针时,为什么需要C样式的强制转换?”。 答案是:“您只是忘记了使用public
继承。”
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.