C ++中的多态性-指针访问函数

米奇

得到了以下简单结构:

    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,因此我仍然具有多态性)时,该如何使用它?

Nikos C.

如果可以确定指针指向一个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您所投射的指针是否实际上没有指向Derived1static_cast不执行此检查,从而使其更快。但是,如果您要投射的指针实际上没有指向Derived1对象,则访问结果指针会导致未定义的行为。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章