无法访问基类函数C ++

时间:2018-09-22 11:30:24

标签: c++ inheritance stl

为什么要这段代码:

class myvector: public std::complex<float>{
            float x;
            float y;
            public:
            myvector(const float x_ = 0, const float y_ = 0) : std::complex::complex(x_), std::complex::complex(y_), x(x_), y(y_) {}
    };

int main(){
    myvector u, v;
    std::cout<< u + v;
}

导致此错误?

error: conversion from ‘std::complex<float>’ to non-`scalar type ‘myvector’ requested`

因为我继承了已经具有重载+运算符的std :: complex,所以我不能访问重载+运算符吗?

2 个答案:

答案 0 :(得分:1)

您不需要成员xy,因为这些值存储在您的类继承的std::complex中。

#include <complex>
#include <iostream>

class myvector : public std::complex<float> {
public:
    myvector(const float x_ = 0, const float y_ = 0)
    : std::complex<float>{ x_, y_ }  // just call the base class constructor
    {}
};

int main()
{
    myvector u, v;
    std::cout << u + v;
}

Thou shalt not inherit from classes that don't have a virtual destructor, though.

答案 1 :(得分:1)

问题是编译器不知道如何将std::complex<float> operator+(const std::complex<float>&, const std::complex<float>&)应用于您的具体类myvector。直接的解决方法是为您的类或隐式转换构造函数编写一个重载的operator +:

class myvector : public std::complex<float> {
public:
    myvector(const float x_ = 0, const float y_ = 0)
    : std::complex<float>{ x_, y_ }  // just call the base class constructor
    {}

    myvector(const std::complex<float> &ref) : std::complex<float>(ref) {}
};

但是,您似乎正在尝试通过使用继承来扩展std::complex类的功能,这通常不是一个好主意,因为其析构函数不是虚拟的。更好的方法是让std::complex成为您myvector的成员,并提供自己的公共API。