我在C ++中有继承问题。附加的代码生成输出“1,1”,但我认为类b
和c
中的操作方法替换了类a
中的操作方法。所以我期望输出“ 2,3,”。我需要更改什么才能获得输出“ 2,3,”?
#include <iostream>
//Class a
class a
{
public:
a();
int action();
};
a::a()
{
}
int a::action()
{
return 1;
}
//Class b
class b : public a
{
public:
b();
int action();
};
b::b()
{
}
int b::action()
{
return 2;
}
//Class c
class c : public a
{
public:
c();
int action();
};
c::c()
{
}
int c::action()
{
return 3;
}
//Main Programm
int main()
{
a arr[2];
arr[0] = b();
arr[1] = c();
for(int i = 0; i<2; i++)
{
std::cout << arr[0].action() << ",";
}
return 0;
}
答案 0 :(得分:2)
动作需要在基类中是虚拟的,否则你无法覆盖它。
您可以使用foo() override
表示法来检查是否真的覆盖了某些内容。
您必须通过指向基类型的指针访问派生类型,否则您将切片并执行其他令人讨厌的事情。另外,有时候让析构函数变为虚拟也是个好主意。
class Base { };
class Derived : public Base { };
some_container<Base*> baseOrDerived;
然后,您可以将Base和Derived对象分配到此容器中。例如,使用new
,您可能希望使用std::shared_ptr<Base> or std::unique_ptr<Base>
代替Base*
。
答案 1 :(得分:1)
你可以用虚函数得到输出“2,3”:
首先,您应该在课程a中change void action();
到virtual void action();
;
第二,你应该使用指针来实现多态;
第三,您应该将arr[0]
更改为arr[i]
;
这是我的代码:
#include <iostream>
//Class a
class a
{
public:
a();
virtual int action();
};
a::a()
{
}
int a::action()
{
return 1;
}
//Class b
class b : public a
{
public:
b();
int action();
};
b::b()
{
}
int b::action()
{
return 2;
}
//Class c
class c : public a
{
public:
c();
int action();
};
c::c()
{
}
int c::action()
{
return 3;
}
int main(int argc, char *argv[])
{
a *(arr[2]);
arr[0] = new b();
arr[1] = new c();
for(int i = 0; i<2; i++)
{
std::cout << arr[i]->action() << ",";
}
return 0;
}
这是我的输出: