不能因为类不是多态而沮丧吗?

2024-04-10

是否可以在没有虚方法的情况下进行继承?编译器表示以下代码不是多态的。

Example:

class A {
public:
    int a;
    int getA(){return a;};
}


class B : public A {
public:
    int b;
    int getB(){return b;};
}

在另一堂课上,我们正试图从A反对B object:

 A *a = ...;
 B *b = dynamic_cast<B*>(a)

但这会产生以下编译时错误:

 cannot dynamic_cast ... (source type is not polymorphic)

尽管存在语法错误,但您不能dynamic_cast非多态类型。static_cast是在这种情况下您将使用的强制转换,如果您知道它实际上是目标类型的对象。

之所以:static_cast基本上让编译器在编译时执行检查“输入是否可以转换为输出?”这可用于向上或向下转换指针(或引用)的继承层次结构的情况。但检查仅在编译时进行,并且编译器假设您知道自己在做什么。

dynamic_cast只能在指针或引用强制转换的情况下使用,并且除了编译时检查之外,它还会执行额外的运行时检查以确保强制转换是否合法。它要求相关类至少有 1 个虚拟方法,这允许编译器(如果它支持 RTTI)执行此附加检查。但是,如果相关类型没有任何虚拟方法,则无法使用它。

最简单的情况(如果您像这样传递指针的话可能是值得的)是考虑将基类的析构函数设为虚拟。除了允许您使用动态强制转换之外,它还允许在删除基类指针时调用适当的析构函数。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

不能因为类不是多态而沮丧吗? 的相关文章

随机推荐