接受 base class 类型参数的虚函数
Virtual function taking parameters of base class type
这里的多态有什么问题?
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);
}
我试过用指针代替引用,但还是不行
我应该覆盖该功能吗?
dosomething()
接受对对象 A
部分的引用。 A
没有名为 y
的成员,就像编译器错误所说的那样。只有 B
有 y
个成员。
假设还有另一个 class 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
对象作为输入,但是 B::dosomething()
仍然没有 y
成员可以读取。
因此,在访问其 y
成员之前,您必须在 B::dosomething()
内部使用类型转换来检查输入 obj
是否实际上是从 B
派生的:
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;
}
};
这里的多态有什么问题?
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);
}
我试过用指针代替引用,但还是不行
我应该覆盖该功能吗?
dosomething()
接受对对象 A
部分的引用。 A
没有名为 y
的成员,就像编译器错误所说的那样。只有 B
有 y
个成员。
假设还有另一个 class 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
对象作为输入,但是 B::dosomething()
仍然没有 y
成员可以读取。
因此,在访问其 y
成员之前,您必须在 B::dosomething()
内部使用类型转换来检查输入 obj
是否实际上是从 B
派生的:
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;
}
};