将对象强制转换为基类或派生类
Cast object to base or derived class?
cBase* object = new cDerived();
和
cDerived* object = new cDerived();
如果是,在哪些情况下我应该选择其中一个而不是另一个?
区别在于它们将object
声明为具有不同的类型,这可能会产生许多后果。例如:
- 如果
cDerived
声明了任何新成员(超出了它从cBase
继承的成员),那么只有cDerived* object
的版本才可以使用这些成员(除非您显式向下转换回cDerived*
)。 - 如果
cBase
声明了cDerived
覆盖的非虚成员函数,那么调用哪一个取决于调用它的指针的类型。 - 如果一个函数期望接受一个
cDerived*
,那么你不能传递给它一个cBase*
(除非你显式向下转换回cDerived*
)。
object
的静态类型在您的两个示例中是不同的。让我们举个例子:
struct A {};
struct B : A
{
void method() {}
};
int main() {
A* a = new B;
B* b = new B;
a->method(); // compile error, A has no member named method.
b->method(); // fine. b's static type is B*, and B has a member named method
}
a
实际上指向B
对象并不重要;它的静态类型是A*
, A
没有名为method
的成员。
相关文章:
- 指向基类派生类的 std::unique_ptr 的指针
- 从多个模板化基类派生时出现"隐藏重载的虚函数"警告
- 从模板基类派生是否在派生类声明的点实例化模板
- 使从一个基类派生的类能够使用继承的受保护成员
- C++多态性访问基类派生类字段
- C++派生类的设置属性到从同一基类派生的未知类对象
- 使用void* 参数定义纯虚函数的抽象基类.派生类匹配参数是指向某种类型的指针
- 在C++中,如何使用将保存从基类派生的任何对象的类成员
- 如何测试从依赖于外部系统的外部基类派生的类
- 如何从模板基类派生非模板类
- 在派生类中使用声明并不能隐藏从基类派生的相同函数
- 从具有静态结构的基类派生
- 具有从 c++ 中的非模板基类派生的模板类的事件系统
- C++ 调用从基类派生的覆盖函数
- 不清楚如何在从抽象基类派生的类中实现运算符重载
- 如何正向声明从正向声明的模板基类派生的类
- 是否可以从 std::enable_shared_from_this 和抽象基类派生
- 多态性c++,试图访问从抽象基类派生的类的成员函数
- C++多重继承,基类派生自同一类
- 基类派生类访问-如何