模板化的嵌套c++类可以继承其外围类吗?

Can a templated nested C++ class inherit its enclosing class?

本文关键字:继承 外围 嵌套 c++      更新时间:2023-10-16

这个问题与嵌套的c++类能否继承它的外围类密切相关?

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

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;

这样的东西能起作用吗?

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

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
{
    ....
};

当然可以。就像在最初的问题中建议的那样,只使用前向声明。

#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;
}
输出:

12

您不能这样做,因为继承需要完整的类定义可用。由于BearGiraffeAnimal中的使用可能会影响Animal的定义,因此您几乎会产生循环依赖关系。

相反,将相关的类分组在一个命名空间中。我看不出为什么特定的动物应该在Animal中嵌套。