子类型和子类之间有什么区别?

时间:2012-12-04 10:30:23

标签: c++

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

4 个答案:

答案 0 :(得分:4)

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

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

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

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

即使继承是私有的,该表达式也是如此。

答案 1 :(得分:2)

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

  • 子类化是指通过从另一个继承而形成新类型。 C ++提供了该机制并调用子类“派生类”。

  • 子类型是指在期望值类型的地方使用子类型值的可能性。在C ++中,您可以认为公共继承意味着子类型关系,或者您可能更具限制性,并且只考虑虚拟函数覆盖确保尊重LSP的情况下的子类型。并且考虑到私有或受保护的继承没有(但仍然是子类化的情况),无论你对虚函数覆盖的限制与否,都是理智的。

所以,像往常一样,精确的定义 - 我故意没有使用 - 将接受或排除一些极端情况(C ++中的私有或受保护的基类)甚至整个域(你是否考虑类型的约束模板参数是否必须符合打字系统?如果你的定义足够开放以适用于很多语言,你最终可以回答是,从而认为C ++有两个打字系统,有交互。现在考虑效果对第二种情况进行明确的专业化。)通常会做出精确的定义,以便简化其中提出的其他工作。

答案 2 :(得分:1)

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

  

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

你应该阅读完整的文章。

答案 3 :(得分:-3)

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

Steve Jessop 写道:

  

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