C ++继承的运算符未在派生类中调用

时间:2012-06-21 06:28:03

标签: c++ inheritance

我在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:我更改了问题以使问题更加清晰。

2 个答案:

答案 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 =是继承的,但默认情况下是由电子编译器生成的。