【问题标题】:Inheriting constructors work only partially继承构造函数仅部分起作用
【发布时间】:2015-11-11 03:59:09
【问题描述】:

我有以下课程,写成这样,可以完全工作,无论 typedef 是什么:

class A
{
protected:
    typedef uchar mDataType;
    std::vector<mDataType> mData;

    uint32 mWidth;
    uint32 mHeight;

    friend class C;
public:
    A();
    A(void* data, uint32 width, uint32 height, size_t dataSize);
    A(const A& other);
    A(A&& other);
    A& operator=(const A& other);
    A& operator=(A&& other) = delete;

    ~A();
}

我想做一个子类,其实差不多,除了重载的typedef:

class B : public A
{
private:
    typedef float mDataType;
public:
    using A::A;
    using A::operator=;
};

我想要实现的是做一个B类,也就是: - 与 A 相同 - 具有所有 As 函数(A 中的成员函数很少,我没有编写) - 拥有所有 As 运算符 - 拥有所有 As 构造函数 - 有不同的 typedef - 具有相同的析构函数

我的代码不起作用,因为我无法调用 B(void*, uint32, uint32, size_t),这正是我想要的。 (Intellisense 仅向我显示 B() 和 B(const B&) 作为可用的构造函数)。

【问题讨论】:

  • 你用的是什么编译器?您确定要在 C++11(或更高版本)模式下编译吗?
  • 哪个编译器? Visual Studio 仅从 2015 年起支持继承构造函数。
  • 非常感谢!我正在使用VS2013。是时候到 2015 年了,我猜……
  • 您知道mData 仍然是std::vector&lt;uchar&gt;,并且基类中mDataType 的所有使用都引用uchar,而不管子类中的mDataType 是什么?
  • 我想让基类对象具有 std::vector 而子类对象具有 std::vector。在成员函数实现中,我只使用 mDataType,所以只改变它,我希望就足够了吗?

标签: c++ c++11 inheritance multiple-constructors inheriting-constructors


【解决方案1】:

看来你想要template而不是继承:

template <typename T>
class Mat
{
private:
    using DataType = T;
    std::vector<T> mData;

    uint32 mWidth;
    uint32 mHeight;

    friend class C;
public:
    Mat();
    Mat(void* data, uint32 width, uint32 height, size_t dataSize);
    Mat(const Mat& other);
    Mat(A&& other);
    Mat& operator=(const Mat& other);
    Mat& operator=(Mat&& other) = delete;

    ~Mat();
};


using A = Mat<uchar>;
using B = Mat<float>;

【讨论】:

  • 我更喜欢使用继承,因为使用指向基类的指针我可以对基类和/或子类进行操作。也许我做错了正确的方法是制作抽象基类和2个子类?然后我可以对两者进行操作,同时使用相同的指针(指向基类)。我想要 2 个类,我可以使用 1 个指针来引用它们,因为我在其他类(C 类)中有这些类的 std::vector 并且希望避免代码重复。正如我所写的那样,我的代码适用于您提供的任何 DataType - 这就是为什么我也考虑模板的原因......但是那些指针呢?
  • @MKK:正如评论中的状态,在您的代码中,BA 几乎相同,它们都有std::vector&lt;uchar&gt; mData;(是的uchar)。在不知道class C 的情况下,很难准确说出如何设计代码。但目前B 几乎没用。 (我还怀疑您采用void* 的构造函数是通用的,可以以不同方式解决)
【解决方案2】:

继承构造函数是only supported since VC++2014 CTP 1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-19
    • 1970-01-01
    • 1970-01-01
    • 2013-06-01
    • 2023-04-03
    相关资源
    最近更新 更多