我有这个功能:
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;
};
答案 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();
当然,这会修改除函数声明之外的行。