C++ 函数调用父类方法而不是子类方法?
我试图弄清楚这里发生了什么,但我不知道。请帮忙C++ 函数调用父类方法而不是子类方法?,c++,c++11,C++,C++11,我试图弄清楚这里发生了什么,但我不知道。请帮忙 class A { protected: string name; public: A(string a) {name = a;} virtual string getName() {return "A name: " + name;} }; class B: public A { public: using A::A; string getName() {return "B name: " + name
class A
{
protected:
string name;
public:
A(string a) {name = a;}
virtual string getName() {return "A name: " + name;}
};
class B: public A
{
public:
using A::A;
string getName() {return "B name: " + name;}
};
void print_name(A obj)
{
cout << obj.getName() << endl;
}
int main()
{
A a("a");
B b("b");
print_name(a);
// "A name: a"
print_name(b);
// "A name: b" why not "B name: b"????
return 0;
}
A类
{
受保护的:
字符串名;
公众:
A(字符串A){name=A;}
虚拟字符串getName(){return“A name:+name;}
};
B类:公共A
{
公众:
使用A::A;
字符串getName(){return“B name:+name;}
};
无效打印名称(obj)
{
假设你有:B类:public int
。这个类的实例中有没有int
的值?显然没有
现在考虑:
class B: public A
...
void print_name(A obj)
print\u name
函数按值获取A
。是否有A
的值是B
的实例?同样,否
也许你想要:
void print_name(A& obj)
对A
的引用可以是AB
阅读。print\u name
的obj
参数实际上是A
副本的一个实例,该副本由A
或B
构造而成。它从来都不是B
的实例,因此B::getName
不可能被调用。我能以某种方式修复它吗?什么如果我不能通过基类使用子对象,那么多形性的意义是什么?您可以通过让函数通过引用或指针获取其参数来修复它。*如果您有一个典型的“如果这是一个B`函数,并将引用传递给引用aB
的a
,您的函数将报告引用是aB
。