1

子类型和子类之间有什么区别,我如何判断一个类是否是另一个类的子类型/子类?

4

4 回答 4

4

C++ 将子类称为“派生类”。

在 C++ 中,类是类型,唯一的“子类型”是派生类。因此,如果您选择在 C++ 中使用“子类型”和“子类”这两个词,它们可能是同一回事。根据您的学术背景,我想您可能会说私有继承不会创建子类型,在这种情况下它们是不同的。就此而言,在某些学术背景下,“子类型”的概念是不合法的(正式的类型理论存在于 OOP 之前。就此而言,在计算机科学之前存在,除非你算上 Babbage)。

在 C++11 中,您可以测试是否AClass是派生类Another(可选地排除它们是同一类的情况):

std::is_base_of<Another, AClass>::value && !std::is_same<Another, AClass>::value

即使继承是私有的,这个表达式也是正确的。

于 2012-12-04T10:40:13.847 回答
2

这些是理论概念,而不是 C++ 概念。但是让我们看看如何将它们应用于 C++。

  • 子类化是指通过从另一个继承来形成新类型。C++ 提供了这种机制并将子类称为“派生类”。

  • 子类型是指在需要类型值的地方使用子类型值的可能性。在 C++ 中,您可以认为公共继承意味着子类型化关系,或者您可以更具限制性并仅在虚函数的覆盖确保尊重 LSP 的情况下考虑子类型化。并且考虑到私有或受保护的继承不(但仍然是子类化的情况)是理智的,无论您对虚函数覆盖施加或不施加任何约束。

所以,像往常一样,精确的定义——我故意没有给出——将接受或排除一些极端情况(C++ 中的私有或受保护的基类)甚至整个域(您是否考虑类型模板参数的约束?是否遵守类型系统?如果您的定义足够开放以适用于许多语言,您最终可能会回答“是”,因此认为 C++ 有两个具有交互作用的类型系统。现在考虑显式专业化的影响第二个。)并且通常会做出精确的定义,以简化提出它们的其余工作。

于 2012-12-04T12:06:14.303 回答
1

来自:http ://www.cs.princeton.edu/courses/archive/fall98/cs441/mainus/node12.html

子类型和子类在支持重用方面存在重要区别。子类允许重用类内部的代码——实例变量声明和方法定义。因此,它们在支持类内的代码重用方面很有用。另一方面,子类型可用于支持外部重用,从而产生一种形式的多态性。也就是说,一旦一种数据类型被确定为另一种数据类型的子类型,任何可以应用于超类型元素的函数或过程也可以应用于子类型元素。

你应该阅读全文。

于 2012-12-04T10:37:30.947 回答
-3

类是程序员定义的新类型,所以我认为子类==子类型。

史蒂夫杰索普写道:

C++ 将子类称为“派生类”。

我想不是。子类是类中的类(就像 Engine 是 Car 的一部分)。

看下面的例子:

#include <iostream>

using namespace std;

class Car
{
    public:
    class Engine //Engine is subclass
    {
        public:
        static void Start()
        {
               cout << "Engine is starting... \n";
        }      
    };
};

class Animal
{
    public:
    static void Eat()
    {
           cout << "Animal is eating... \n";
    }     
};

class Wolf : Animal //Wolf is derived class
{
      public:
      static void Howl()
      {
             cout << "Wolf is howling... \n";
      }
};

int main()
{
    Car::Engine::Start();
    Animal::Eat();
    Wolf::Howl();

    system("PAUSE"); //keep Console Window open in Debug Mode
    return 0;
}
于 2012-12-04T11:06:00.300 回答