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

Mit*_*tch 1 c++ polymorphism inheritance

得到以下简单的结构:

    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();
    }
Run Code Online (Sandbox Code Playgroud)

现在我的问题是:当我不希望 Derived2 的对象可以访问它时,如何访问 Derived1::boo() 函数(使用指针 p1,所以我仍然具有多态性)?

Nik*_* C. 6

如果您可以确定指针指向一个Derived1对象,那么static_cast它:

static_cast<Derived1*>(p1)->boo();
Run Code Online (Sandbox Code Playgroud)

如果你不知道它是否指向一个Derived1对象,那么你需要先用 a 测试它dynamic_cast

if (auto* as_derived1 = dynamic_cast<Derived1*>(p1)) {
    as_derived1->boo();
}
Run Code Online (Sandbox Code Playgroud)

dynamic_cast将评估为nullptr您正在投射的指针是否实际指向 a Derived1static_cast不执行此检查,使​​其更快。但是,如果您正在转换的指针实际上并不指向一个Derived1对象,那么访问结果指针会导致未定义的行为。