繁体   English   中英

运行时数据类型多态

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM