得到了以下简单结构:
class Base {
public:
virtual void foo() { std::cout << "Base" << std::endl; }
};
class Derived1 : public Base {
public:
void foo() override { std::cout << "Derived1" << std::endl; }
void boo() {}
};
class Derived2 : public Base {
public:
void foo() override { std::cout << "Derived2" << std::endl; }
};
int main(){
Base* p1 = new Derived1();
Base* p2 = new Derived2();
p1->foo();
p1->boo();
}
现在我的问题是:当我不希望Derived2的对象可以访问Derived1 :: boo()函数(使用指针p1,因此我仍然具有多态性)时,该如何使用它?
如果可以确定指针指向一个Derived1
对象,则static_cast
它:
static_cast<Derived1*>(p1)->boo();
如果您不知道它是否指向Derived1
对象,则需要先使用进行测试dynamic_cast
:
if (auto* as_derived1 = dynamic_cast<Derived1*>(p1)) {
as_derived1->boo();
}
dynamic_cast
将评估nullptr
您所投射的指针是否实际上没有指向Derived1
。static_cast
不执行此检查,从而使其更快。但是,如果您要投射的指针实际上没有指向Derived1
对象,则访问结果指针会导致未定义的行为。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句