如何从 const base class 引用访问派生的 class 成员?

How to access a derived class member from const base class reference?

class Base1{
    public:
        Base1(){};
        virtual ~Base1() = 0;
}

class Derived1 : public Base1{
    public:
        Derived1(int a) : a(a){};
        ~Derived1();
        int a;
}

class Base2{
    public:
        Base2(){};
        virtual ~Base2() = 0;
}

class Derived2 : public Base2{
    public:
        Derived2(int b) : b(b){};
        ~Derived2();
        int b;
        void func(const Base1 &base1); // How to access Derived1::a here?
}

鉴于上述 class 定义,我如何在 void func(const Base1 &base1) 中访问 Derived1::a?我对多态性还是陌生的。我尝试使用不同的 static_cast 或 dynamic_cast 方法,但其中 none 有效。我应该在函数内部做什么才能从基础 class 引用访问派生的 class 成员?

仅供参考,我无法更改 class 对我的课程作业要求的定义,这就是给我的。我知道将 Derived1 作为参数传递更简单,但我不允许这样做。

Given the above class definition, how can I access Derived1::a in void func(const Base1 &base1)? ... FYI I can't change the class definition for my coursework requirement, and that is what given to me.

理想情况下,您应该在 Base1 中公开一个 virtual 方法,return 是一个 int(或 int&),然后 Derived1 将该方法覆盖到 return 它的 a 成员。

但是,鉴于不允许您更改 class 定义,这不是一个选项。

您需要指向 Derived1 对象的指针或引用才能直接访问其 a 成员。这真的让你只有一种选择 - 你可以使用 dynamic_cast 将基础 class 引用类型转换为派生的 class 类型,例如:

void Derived2::func(const Base1 &base1)
{
    // this will raise an exception if the cast fails at runtime
    const Derived1 &d = dynamic_cast<const Derived1&>(base1);
    // use d.a as needed...
}

或者:

void Derived2::func(const Base1 &base1)
{
    // this will return null if the cast fails at runtime
    const Derived1 *d = dynamic_cast<const Derived1*>(&base1);
    if (d) {
        // use d->a as needed...
    } else {
        // do something else...
    }
}