【发布时间】:2020-10-06 01:59:33
【问题描述】:
当我运行以下代码时:
#include <iostream>
class Shape{
public:
};
class Square:public Shape
{
public:
};
class Circle:public Shape
{
double r;
public:
void SetRadious(double r)
{
std::cout << "R value:" << this->r <<std::endl;
this->r=r;
}
};
int main() {
Shape * s = new Square();
Circle* c= dynamic_cast<Circle*>(s);
c->SetRadious(3.0);
return 0;
}
我收到一条错误消息:
“形状”不是多态的
我读到了,发现我需要写一些虚函数但是有两个问题:
1) 为什么这是必要的,需要一个虚函数是没有意义的。
2) 这种情况下很多人说我需要virtual d'tor 但是为什么默认的就不行了,默认的d'tor和默认的有什么区别呢?
【问题讨论】:
-
这是有道理的,因为(子类型)多态性有一个成本,如果你不使用它,你就不想支付,如果你不使用它,你就不会使用它' t 有虚函数。
-
请注意,即使具有多态性,正方形也不是圆形,因此
c将是 nullptr,在取消引用时会导致 UB。
标签: c++ class inheritance polymorphism dynamic-cast