如何从 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...
}
}
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
invoid 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...
}
}