虚拟方法不作用于虚拟
Virtual methods not acting virtual
请考虑以下代码:
#include<iostream>
#include<vector>
class A
{
public:
A(int n = 0) : m_n(n) {}
public:
virtual int value() const {return m_n;}
virtual ~A() {}
protected:
int m_n;
};
class B : public A
{
public:
B(int n = 0) : A(n){}
public:
virtual int value() const {return m_n + 1;}
};
int main(char* args[])
{
const A a(1);
const B b(3);
const A *x[2] = {&a, &b};
typedef std::vector<A> V;
V y;
y.push_back(a);
y.push_back(b);
V::const_iterator i = y.begin();
std::cout << x[0]->value() << x[1]->value()
<< i->value() << (i+1)->value() << std::endl;
getchar();
return 0;
}
为什么打印出1413
,而不是1414
?我希望value()
即使像(i+1)->value();
一样调用也能表现为虚函数。
您的向量V
包含A
对象,因此没有动态调度的范围。你总是在打电话给A::value()
.将对象的B
部分复制到矢量中时,它们将被切掉。它与执行此操作相同:
B b(1);
A a1 = b; // a1 is an A object, not a B.
a1.value();
请参阅对象切片。
因为当你这样做时y.push_back(b);
切片就会发生;vector
保存类型为A
的对象。要使用多态性,您需要引用或指针。
相关文章:
- 用于创建/注册虚拟存储设备的 IOKit 驱动程序
- 如何编写 operator= 用于使用虚拟方法与非平凡成员的匿名联合
- c++\CLI dll包装器,用于调用c++类中的虚拟成员
- 与虚拟破坏者相比,Shared_PTR的运行时开销用于子类破坏
- 不会用于删除对象的基类的析构函数应该是虚拟的吗?
- 为什么虚拟键盘不适用于QT中的QDialog TextBox
- 用于堆栈分配对象的C++虚拟析构函数内联
- 如何在 CLANG 中创建用于代码完成的虚拟文件
- 用于动态链接的虚拟文件
- 用于虚拟对象的Linux线程.有人能解释linux中多线程库之间的区别吗
- 堆栈展开动态创建的对象,该对象的构造函数也作用于堆
- 用于查询自定义数据类型列表的SQLite虚拟表
- 用于优化性能的C++虚拟机
- 名称篡改是否适用于c++中的虚拟函数
- 用c++模拟按键,用于QML虚拟键盘
- 用于处理大数组的虚拟内存示例
- 创建用于在模板中搜索的虚拟数据
- 为什么static_cast不能用于在涉及虚拟继承时向下投射?
- 虚拟函数不适用于 1 个类,但适用于另一个类
- 用于多重继承的虚拟方法表