【发布时间】:2021-08-27 11:56:10
【问题描述】:
以下代码可以正常编译:
#include<iostream>
class Base {
protected:
int _a;
public:
virtual ~Base()=default;
Base(int a) : _a{a} {};
int getit() const { return _a; }
};
class Derived : public Base {
public:
Derived(int a) : Base{a} {};
int get2() const { return 2*this->_a; }
};
int main() {
Base D{2};
auto* ptr = &D;
auto* ptr2 = static_cast<Derived*>(ptr);
std::cout << ptr2->get2() << std::endl;
}
输出
4
如果我将static_cast 更改为dynamic_cast,则会出现段错误。
我的问题:
使用static_cast 强制转换为不添加任何数据成员的派生类是否安全?
【问题讨论】:
-
未定义行为的一个令人讨厌的事情是,有时它可能会起作用。这并不意味着它确实如此。
-
ptr和ptr2均未指向Derived对象。因此强制转换是错误的,取消引用指针会导致未定义的行为。
标签: c++ dynamic-cast static-cast