给出以下代码:
class Base
{
public:
virtual ~Base() = default;
};
class Derived : public Base { };
int main(void)
{
Derived d;
Base* pb = &d;
Base** ppb = &pb;
Derived** ppd = ...; // Can this be defined in a type-safe manner?
return 0;
}
是否可以为ppd
的赋值提供类型安全的表达式,而不引入类型为Derived*
的中间变量?
答案 0 :(得分:3)
AFAIK,并非声明指向Derived
的{{1}}指针。指向d
(Base
)的d
指针已经通过抽象丢失了类型信息,如果没有不安全的强制转换,则无法恢复。
由于您要声明指向pb
的指针,因此首先需要指向Derived
的指针。例如:
Derived
这两个定义都是类型安全的,在编译时检查。
答案 1 :(得分:1)
是否可以为
ppd
的赋值提供类型安全的表达式,而不引入类型为Derived*
的中间变量?
嗯,有明显安全的选择:
Derived** ppd = nullptr;
否则:否。Derived**
可以安全指向的唯一对象是Derived*
。你没有Derived*
对象,也没有兴趣介绍一个,所以你不能指向一个。
请注意,Base*
不是Derived*
的基础,因此Base**
和Derived**
之间没有多态关系Base*
和Derived*
。