0

我在 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

为什么派生类中没有调用赋值运算符?

Edit1:我已更改问题以使问题更清楚。

4

2 回答 2

2

构造函数不作为常规公共函数继承。如果缺少默认构造函数,则由编译器定义,但您应该A为. 您还需要定义一个赋值运算符。CD

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; 
    }
};
于 2012-06-21T06:32:58.667 回答
0

您可以使用以下命令显式收回所述 operator=:

using C::operator=

在D级。

operator= 是继承的,但默认情况下被电子编译器生成的掩码。

于 2012-06-21T07:05:43.330 回答