继承和多态打印功能

时间:2016-01-19 11:55:18

标签: c++ inheritance polymorphism

我有这个功能:

void f(const A& a){a.print()};

和一个班级:

class A { 
void print() const{cout<<"a"<<endl;}
}

在第一部分中,我希望我的代码使用继承打印b而不更改打印功能。 我尝试实现继承自B的新类A。我的代码打印出来了。 现在在第二部分我只需要改变这一行:void f(const A& a)我的代码应该打印一个。 我怎么能这样做?

#include <stdlib.h>
#include <iostream>
#include <string>
using namespace std;

class A{
protected:
    string a;
public:
    A(string a):a(a){}
    virtual void print()const{
        cout<<"a"<<endl;
    }
    virtual ~A(){}

};
class B:public A{
    //string b;
public:
    B(string b):A(b){}
    virtual void print()const{
        cout<<"b"<<endl;
    }
    virtual ~B(){}

};
void f(const A& a){
    a.print();
}
int main(){
    B a=B("b");
    f(a);
    return 0;
};

3 个答案:

答案 0 :(得分:0)

您可以通过按值传递参数

来获得此效果
void f(A a);

这样,该函数将收到从A派生的任何类的A部分的副本。

这有时是错误的(见What is object slicing?),但是在这里完成了工作。

答案 1 :(得分:0)

如果要避免虚拟调用,则需要一个类型为A的新对象

您可以使用按值传递参数或在函数f:

中创建类型A的副本
void f(const A& a) {
    A tmp(a);
    tmp.print()
}

答案 2 :(得分:0)

您确实可以复制基类子对象,如其他答案中所述。但是你不需要,使用静态调度通常更有意义:

a.A::print();

当然,这会修改除函数声明之外的行。