Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;多个派生类之间的运算符重载_C++_Templates_Inheritance_Operator Overloading - Fatal编程技术网

C++ C++;多个派生类之间的运算符重载

C++ C++;多个派生类之间的运算符重载,c++,templates,inheritance,operator-overloading,C++,Templates,Inheritance,Operator Overloading,我有一个基本类和两个派生类。我想实现一些乘法运算符,可以用来将两个类中的对象相乘 class Base { public: virtual ~Base() {} virtual void print() = 0; Base operator * (Base & b1, Base & b2) { return b1 * b2; } <---- this wont work because of pure virtual function }; cl

我有一个基本类和两个派生类。我想实现一些乘法运算符,可以用来将两个类中的对象相乘

class Base
{
public:
    virtual ~Base() {}
    virtual void print() = 0;

    Base operator * (Base & b1, Base & b2) { return b1 * b2; } <---- this wont work because of pure virtual function
};

class D2;

class D1 : public Base
{
public:
    void print() { ....} 
    D1 operator * (D1 & d) {//do some operation here}
    D1 operator * (D2 & d) {//same as above...}

private:
    int i;
};

class D2 : public Base
{
public:
    void print() { ....} 
    D2 operator * (D1 & d) { ..... }
    D2 operator * (D2 & d) { ..... }

private:
    double j;
    double m;
};
类基
{
公众:
虚拟~Base(){}
虚空打印()=0;
基运算符*(基&b1,基&b2){return b1*b2;}
//这将导致编译错误

你们想把两个完全不同的对象和第三个对象相乘吗?实际上这并没有任何意义。这个函数原型是在运算符使用非成员函数重载时使用的

所以对于你的班级,你也可以使用

Base operator * (Base & b2) { return *this * b2; } 
//假设函数类不是抽象的

这基本上扩展为->运算符*(b2)

现在谈到

D1 operator * (D1 & d) {//do some operation here}
D1 operator * (D2 & d) {//same as above...}
为什么这行?为什么需要两个函数

您可以使用转换函数从一种类型的对象进行转换,反之亦然 然后只有一个过载的操作员*可以完成您的工作。

虽然,代码的数量几乎相同,但至少看起来是一样的 清洁工

您也可以使用模板,但为此,必须有一个用于运算符重载的通用实现。 这可以通过使用转换函数来实现,因为这样就可以为运算符*函数实现通用代码


如果我完全误解了您的问题,或者我正朝着完全相反的方向走,请告诉我。

您是否考虑过外部
运算符*
,它不是这两个类的方法,但可能是这两个类的朋友?
D1 operator * (D1 & d) {//do some operation here}
D1 operator * (D2 & d) {//same as above...}