Luk*_*ker 6 c++ polymorphism inheritance overloading
我之前问了一个问题,但事实证明我的问题没有通过我的例子正确建模.所以这是我的实际问题:
A,班级B继承自A,foo(A&)和foo(B&),A*指针列表,包含A和的实例B.foo(A&)实例A和foo(B&)实例B?约束:我可以修改A和B实现,但不能实现foo.见下面的例子:
#include <iostream>
#include <list>
class A {
public:
};
class B : public A {
public:
};
void bar(A &a) { std::cout << "This is an A" << std::endl; }
void bar(B &b) { std::cout << "This is a B" << std::endl; }
int main(int argc, char **argv) {
std::list<A *> l;
l.push_back(new B());
l.push_back(new B());
for (std::list<A *>::iterator it = l.begin(); it != l.end(); ++it)
bar(**it);
}
Run Code Online (Sandbox Code Playgroud)
虽然我使用带指针的容器,但是使用bar父类的对象调用,而不是子类:
# ./a.out
This is an A
This is an A
#
Run Code Online (Sandbox Code Playgroud)
我在期待
This is a B
Run Code Online (Sandbox Code Playgroud)
传递指针bar(通过重写其签名)并没有帮助.
感谢安东尼奥帮助澄清这个问题.
由于在编译时解决了重载问题,因此需要为编译器提供足够的信息来决定bar调用的正确重载.由于您希望根据对象的运行时类型动态做出决策,因此虚函数将有很大帮助:
struct A {
virtual void bar() { bar(*this); }
};
struct B : public A {
virtual void bar() { bar(*this); }
};
Run Code Online (Sandbox Code Playgroud)
它可能看起来像是相同的,所以B::bar可以被消除,但事实并非如此:虽然实体看起来完全相同,但bar由于C++中的重载的静态解析,它们会调用不同的s:
A::bar类型内部*this是A&,所以调用第一个重载.B::bar类型内部*this是B&,所以调用第二个重载.修改调用代码以调用该成员bar将完成更改:
std::list<A *> l;
l.push_back(new B());
l.push_back(new B());
for (std::list<A *>::iterator it = l.begin(); it != l.end(); ++it)
(*it)->bar();
Run Code Online (Sandbox Code Playgroud)