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
的引用可以是A
B

阅读。
print\u name
obj
参数实际上是
A
副本的一个实例,该副本由
A
B
构造而成。它从来都不是
B
的实例,因此
B::getName
不可能被调用。我能以某种方式修复它吗?什么如果我不能通过基类使用子对象,那么多形性的意义是什么?您可以通过让函数通过引用或指针获取其参数来修复它。*如果您有一个典型的“如果这是一个B`函数,并将引用传递给引用a
B
a
,您的函数将报告引用是a
B