这里的多态性有什么问题?
class A
{
public:
int x;
virtual void dosomething(const A& ob) = 0;
};
class B : public A
{
public:
int y;
void dosomething(const A& ob) { // I assume this will work (base class accepting a derived class by reference)
x += ob.x;
y += ob.y; // error: const class A has no memeber named 'y'
cout<<x<<" "<<y;
}
};
int main()
{
B s, m;
s.x = 3;
s.y = 9;
m.x = 3;
m.y = 9;
s.dosomething(m);
}
我尝试使用指针而不是引用,但仍然没有工作
我应该覆盖这个功能吗?
答案 0 :(得分:4)
dosomething()
接受对对象的A
部分的引用。 A
没有名为y
的成员,就像编译错误所说的那样。只有B
有y
成员。
想象一下,还有另一个类C
也来自A
但不是B
,其中C
也没有y
成员。如果将C
对象传递给B::dosomething()
?
class C : public A
{
public:
int z;
void dosomething(const A& ob) { ... }
};
B b;
C c;
b.dosomething(c);
这不行。 B::dosomething()
可以接受C
个对象作为输入,但y
仍然没有B::dosomething()
个成员可以阅读。
因此,您必须在B::dosomething()
内使用类型转换来检查输入obj
是否实际上是从B
派生的,然后才能访问y
成员:
class B : public A
{
public:
int y;
void dosomething(const A& ob) {
x += ob.x;
const B *b = dynamic_cast<const B*>(&ob);
if (b) y += b->y;
cout << x << " " << y;
}
};