#include <iostream>
using namespace std;
struct A
{
virtual int func(void) { return 0; }
};
struct B : A
{
int func(void) { return 1; }
};
int main()
{
A b = B();
cout << b.func() << endl;
}
我希望输出为1
,但大多数人都会知道它的0
。
我想在实际代码中实现的是这些内容。
struct A
{
virtual int operator() (int i);
};
struct B : A
{
int operator() (int i) { return i*2; }
};
struct C : A
{
int operator() (int i) { return i*3; }
};
struct x
{
A test;
};
因此,我的容器无法预先判断它是否会包含A
,B
或C
,但其行为应该不同。
有没有办法实现我预期的功能?
答案 0 :(得分:4)
A b = B();
:您正在构建A
类型的对象,使用来自B
对象的赋值运算符/复制构造函数(通过复制省略),但看作是对A
的引用(这解释了为什么编译没有错误)
这不是多态性。 b
仍为A
类型。 B
的链接已丢失。
那会这样做:
A *b = new B();
现在
cout << b->func() << endl;
触发多态/虚函数并按预期产生1。
答案 1 :(得分:2)
C ++虚函数仅适用于引用/指针,这意味着间接。
A b = B();
这会创建一个类型A的对象,而不是类型B.没有间接,因此只调用A中的函数。