我在C ++中有以下代码
#include <iostream>
#include <list>
#include <algorithm>
using namespace std;
class A{
public:
int x;
int y;
int first(){
return x;
}
int second(){
return y;
}
};
class C{
public:
float a,b;
C(){
a = 0.0f;
b = 0.0f;
}
template<class T>
C(T t){
cout<<"Copy Constructor\n";
a = t.first();
b = t.second();
}
template<class T>
C & operator=(T const &c){
cout <<"Assignment operator\n";
this->a = c.first();
this->b = c.first();
}
};
class D: public C{
public:
template <typename T> D (T t) : C(t) {}
float area(){
return a*b;
}
};
int main(){
A a;
a.x = 6;
a.y = 8;
C c(a);
D d(a);
D e = a; // Here copy constructor is being called!!
cout<<e.a<<" "<<e.b<<" "<<e.area()<<endl;
}
以下是上述程序的输出
Copy Constructor
Copy Constructor
Copy Constructor
6 8 48
为什么不在派生类中调用赋值运算符?
编辑1:我更改了问题以使问题更加清晰。
答案 0 :(得分:2)
构造函数不会作为常规公共函数继承。默认构造函数由编译器定义(如果缺少),但是您应该为A
定义一个构造函数,该构造函数采用C
参数(或对D
进行模板化)。您还需要定义赋值运算符。
class D: public C{
public:
D(A aparam)
: a(aparam.first(), b(aparam.second()){
}
D& operator=(const D& rhs){
a = rhs.first();
b = rhs.second();
}
float area(){
return a*b;
}
};
答案 1 :(得分:0)
你可以使用:
显式地获取所述operator =using C::operator=
在D班。
operator =是继承的,但默认情况下是由电子编译器生成的。