C ++在派生类中指定变量类型a posteriori

时间:2014-09-23 11:16:39

标签: c++ class inheritance

我有两个不同类型对象的数据库,它们有一些共同的功能,所以我想创建一个带有常用函数定义的父类。这个想法是即使对象的类型不同,这些函数也必须执行相同的操作。一个愚蠢的例子:

class Database
{
public:
    // retrieve size of the dataset
    int Size() const {return list_.size();}
};

class DerivedDatabase : public Database
{
private:
    // list of dataset objects
    std::vector<Object1> list_;
};

class DerivedDatabase2: public Database
{
private:
    // list of dataset objects
    std::vector<Object2> list_;
};

一种解决方案是将函数定义为virtual Size() const =0,然后让派生类覆盖它。但是我的想法是在必须创建新类型的DataBase时已经实现了它。有没有办法在派生类中指定变量类型的后验?两个派生的数据库本质上是不同的,除了一些常见的功能外,它们的行为完全不同。因此,它们必须是单独的对象

2 个答案:

答案 0 :(得分:2)

您可以使用CRTP来对代码进行分解,例如:

template <typename T> class Database
{
// T should have a container named list_
public:
    // retrieve size of the dataset
    int Size() const { return AsDerived().list_.size(); }
private:
    const T& AsDerived() const { return static_cast<const T&>(*this); }
    T& AsDerived() { return static_cast<T&>(*this); }
};

然后

class DerivedDatabase : public Database<DerivedDatabase>
{
    friend class Database<DerivedDatabase>;
private:
    std::vector<Object1> list_;
};

class DerivedDatabase2 : public Database<DerivedDatabase2>
{
    friend class Database<DerivedDatabase2>;
private:
    std::vector<Object2> list_;
};

请注意,DerivedDatabaseDerivedDatabase2在此处不共享公共基本类型

Live example

答案 1 :(得分:1)

当然,template的用途是什么:

class Database {
    virtual int size() = 0;
public:
    // retrieve size of the dataset
    int Size() const {return size();}
}

template<typename T>
class DerivedDatabase: public Database {
    std::vector<T> list_;
    int size() const {return list_.size();}
}