gpt4 book ai didi

c++ - 将点之间的 “dynamic_cast”转换为类

转载 作者:行者123 更新时间:2023-12-02 11:15:07 25 4
gpt4 key购买 nike

我尝试通过以下方式通过“dynamic_cast”进行转换:

#include <iostream>

class Shape {
//....
};

class Square: Shape {
//....
};

class Circle: Shape {
//....
};

int main() {
Circle cr;
Shape* sh = &cr; // ERROR1
Square* psq = dynamic_cast<Square*>(sh); //ERROR2
return 0;
}

我收到错误消息:

ERROR1: 'Shape' is an inaccessible base of 'Circle'

ERROR2: cannot dynamic_cast 'sh' (of type 'class Shape*') to type 'class Square*' (source type is not polymorphic)



有人可以解释为什么我得到这些错误吗?

最佳答案

第一个错误是您必须从Shape公开继承,才能在派生对象构造中调用Shape的构造函数。

第二个错误是因为Shape类必须是多态的,这意味着至少存在一个虚拟方法:

class Shape {
public:
virtual ~Shape(){}
//....
};

class Square: public Shape {
//....
};

class Circle: public Shape {
};

Circle cr;
Shape* sh = &cr; // ERROR1
Square* psq = dynamic_cast<Square*>(sh);
  • 多态需要指向基类和虚函数的指针以及运算符重载。
  • 您可以使用dynamic_cast将派生类强制转换为非多态基类。但是您不能将非多态基类dynamic_cast到派生类。

  • 例如:
    Circle* cr = new Circle;
    Shape* shp = dynamic_cast<Shape*>(cr); // upcasting

    即使基类 Shape不是多态的,上面的行也可以正常工作。

    关于c++ - 将点之间的 “dynamic_cast”转换为类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49340492/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com