采用基类类型参数的虚拟函数
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
成员。
想象一下,还有另一个类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()
读取。
因此,在访问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;
}
};
相关文章:
- C++无法定义虚拟函数 OUTER 类和头文件
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 尝试将unique_ptrs推送到向量时使用纯虚拟函数错误
- 有没有比在库中添加一个并非由所有派生类实现的新虚拟函数更好的设计实践
- 类型擦除的std::function与虚拟函数调用的开销
- 重写虚拟函数和继承
- 用纯虚拟函数兜圈子
- 为什么使用存储在虚拟方法表中的地址调用虚拟函数的函数会返回垃圾?
- 禁止子函数调用父级的抽象(或虚拟)函数
- 无法在子类中使用虚拟函数C++
- 无法在派生对象上运行虚拟函数
- 我可以调用从 main() 覆盖的虚拟函数吗?
- 在 C++ 中将函数获取和设置为虚拟函数
- 使用在堆栈上创建的对象调用虚拟函数
- 为什么在这种情况下不调用我的虚拟函数实现?
- 在C++中使虚拟函数私有化
- 模板继承类中的虚拟函数
- 为什么构造函数的虚拟函数调用有时有效,但其他调用却无效
- doxygenc++虚拟函数和实现
- 如何从派生类函数中调用虚拟函数