【发布时间】:2017-09-27 12:47:55
【问题描述】:
我有两个基类和派生版本,它们像这样重载/覆盖某些部分:
class base
{
public:
int X = 1;
};
class deriv : public base
{
public:
int X = 2;
};
class A
{
public:
base K;
virtual void doSmth()
{
std::cout << "A" << std::endl;
smthElse();
}
virtual void smthElse()
{
std::cout << K.X << std::endl;
}
};
class B : public A
{
public:
deriv K;
void doSmth()
{
std::cout << "B" << std::endl;
smthElse();
}
};
应用程序看起来像这样
int main()
{
A instanceA;
B instanceB;
instanceA.doSmth();
instanceB.doSmth();
getchar();
return 0;
}
因此,A 和 B 两个实例的输出为 X=1。我想知道为什么会这样。
A 使用 base (X=1) 和 B 使用 deriv (X=2)。 deriv 重载 X 和 B 重载 K。是不是因为函数smthElse()只定义在A中,所以A无法知道重载变量K的存在?
如果是这样,函数smthElse() 有没有办法使用重载变量K?
我找到了using 关键字,但还在B 中添加using A::smthElse; 不会改变X 的行为,而不是打印为2。我可以实现这一点的唯一方法是复制函数smthElse() from A 并将其插入B。
有没有不同的方法来实现我正在寻找的东西?因为将相同的函数复制“n”粘贴到B 中只是为了使用被覆盖的变量似乎有点过头了。
提前致谢!
【问题讨论】:
-
虽然您可以拥有多态成员函数(使用
virtual关键字),但成员变量不能拥有相同的成员函数。每个类都有自己的独立成员变量K,B中的那个与A中的完全无关。 -
同样适用于
derived::base::X和derived::X。
标签: c++ oop inheritance overriding overloading