C++多态性:从基类到派生类
C++ polymorphism: going from base class to derived class
class A{};
class B : A{};
void func(A* p)
{
B* p2 = p; // Error
}
你的代码有几个奇怪的地方。
- 使用私有继承。在私有继承中,当您不在类范围本身内时,您将无法转换为派生类。
- 即使你将公开继承,你也需要基类中至少有一个虚函数(应该是析构函数)才能使用
dynamic_cast
。 - 当你需要大量的向下投射时,你很可能做错了什么。您可能应该重新考虑所提供 API 的设计或使用。
通常,事情看起来像这样:
class A {
public:
virtual ~A() {}
};
class Derived : public A {
};
void func(A* a) {
if(Derived* d = dynamic_cast<Derived*>(a)) {
// yeah, a is of type derived
} else {
// a is not of type Derived
}
}
is-a
关系是通过public
继承来实现的。 由于您private
继承它,因此association
关系不是is-a
。 所以B
不是A
.因此,您不能将A
存储在B
中,否则A
无法成为B
并且dynamic_cast
不起作用,因为源类型不是多态的static_cast
都行不通,因为"A"是"B"的不可访问的基础
要建立is-a
关系,您需要做class B: public A{}
对于类,默认使用私有继承。
相关文章:
- 如何通过派生类函数更改基类中的向量
- 如何使用基类指针引用派生类成员
- 使用基类指针创建对象时,缺少派生类析构函数
- 如何引用基类的派生类?
- 如果基类包含双指针成员,则派生类的构造函数
- 为什么此派生对象无法访问基类的后递减方法?
- 使用基类中的派生方法运行线程,而无需使用模板
- 是否可以使用基类非虚拟方法中的派生类虚拟方法?
- C++重载函数,一个采用基类的参数,另一个采用派生类的参数
- 在派生类中使用基类的私有成员变量的最佳方法
- 基类和派生类的多态赋值运算符
- 如何在从抽象基派生的类中实现相同的方法?
- 基类的填充将被复制到派生类中
- 如何在不使用指针的情况下将派生类的对象作为参数传递给基类中的函数?
- 指向基类派生类的 std::unique_ptr 的指针
- 为什么基类数据在派生类数据之前初始化
- c++ 派生基类 Friend 函数访问父级上的私有函数
- 如何将基类替换为派生基类
- 当基类未指定构造函数时,如何使用仅具有带参数的构造函数的类派生基类?
- 解析公用派生基类模板中的函数模板名称时出错"Not declared in this scope"