模板化嵌套C ++类是否可以继承其封闭类?

时间:2011-11-01 12:30:12

标签: c++ inheritance nested-class

这个问题与Can a nested C++ class inherit its enclosing class?

密切相关

我的情况很复杂,模板似乎意味着先前的answer不再有效。

class Animal
{
    template <typename T>
    class Bear : public Animal
    {
        // …
    };

    template <typename T>
    class Giraffe : public Animal
    {
        // …
    };
};

// example usage

struct MyAnimal : Animal::Bear<Animal> { };

MyAnimal a;

这样的事情可以起作用吗?

3 个答案:

答案 0 :(得分:3)

另一个答案有效,你只需要知道它的语法:

class Animal
{
    template <typename T>
    class Bear;

    template <typename T>
    class Giraffe;
};

template <typename T>
class Animal::Bear : public Animal
{
    ....
};

template <typename T>
class Animal::Giraffe : public Animal
{
    ....
};

答案 1 :(得分:1)

当然可以。与原始问题中的建议一样,只需使用前向声明。

#include <iostream>

class Animal
{
public:
    template <typename T>
    class Bear;

    template <typename T>
    class Giraffe;

    int val;
};

template <typename T>
class Animal::Bear : public Animal
{
    public:
    T b_member;

    virtual void print(){
        std::cout << b_member.val << endl;
    }

};

template <typename T>
class Animal::Giraffe : public Animal
{
    public:
    T g_member;

    virtual void print(){
        std::cout << g_member.val << endl;
    }
};

struct BearAnimal : Animal::Bear<Animal> 
{ 
};

struct GiraffeAnimal : Animal::Giraffe <Animal> 
{ 
};


int main()
{
    BearAnimal btest;
    GiraffeAnimal gtest;
    btest.b_member.val = 1;
    gtest.g_member.val = 2;
    btest.print();
    gtest.print();    

    return 0;
}

输出:

1 2

答案 2 :(得分:0)

您不能这样做,因为继承要求完整的类定义可用。由于BearGiraffeAnimal内的使用可能会影响动物的定义,因此您几乎可以使用循环依赖。

而是将命名空间中的相关类分组。我认为没有理由将特定动物嵌套在Animal内。