子类型和子类之间有什么区别,我如何判断一个类是否是另一个类的子类型/子类?
4 回答
C++ 将子类称为“派生类”。
在 C++ 中,类是类型,唯一的“子类型”是派生类。因此,如果您选择在 C++ 中使用“子类型”和“子类”这两个词,它们可能是同一回事。根据您的学术背景,我想您可能会说私有继承不会创建子类型,在这种情况下它们是不同的。就此而言,在某些学术背景下,“子类型”的概念是不合法的(正式的类型理论存在于 OOP 之前。就此而言,在计算机科学之前存在,除非你算上 Babbage)。
在 C++11 中,您可以测试是否AClass
是派生类Another
(可选地排除它们是同一类的情况):
std::is_base_of<Another, AClass>::value && !std::is_same<Another, AClass>::value
即使继承是私有的,这个表达式也是正确的。
这些是理论概念,而不是 C++ 概念。但是让我们看看如何将它们应用于 C++。
子类化是指通过从另一个继承来形成新类型。C++ 提供了这种机制并将子类称为“派生类”。
子类型是指在需要类型值的地方使用子类型值的可能性。在 C++ 中,您可以认为公共继承意味着子类型化关系,或者您可以更具限制性并仅在虚函数的覆盖确保尊重 LSP 的情况下考虑子类型化。并且考虑到私有或受保护的继承不(但仍然是子类化的情况)是理智的,无论您对虚函数覆盖施加或不施加任何约束。
所以,像往常一样,精确的定义——我故意没有给出——将接受或排除一些极端情况(C++ 中的私有或受保护的基类)甚至整个域(您是否考虑类型模板参数的约束?是否遵守类型系统?如果您的定义足够开放以适用于许多语言,您最终可能会回答“是”,因此认为 C++ 有两个具有交互作用的类型系统。现在考虑显式专业化的影响第二个。)并且通常会做出精确的定义,以简化提出它们的其余工作。
来自:http ://www.cs.princeton.edu/courses/archive/fall98/cs441/mainus/node12.html
子类型和子类在支持重用方面存在重要区别。子类允许重用类内部的代码——实例变量声明和方法定义。因此,它们在支持类内的代码重用方面很有用。另一方面,子类型可用于支持外部重用,从而产生一种形式的多态性。也就是说,一旦一种数据类型被确定为另一种数据类型的子类型,任何可以应用于超类型元素的函数或过程也可以应用于子类型元素。
你应该阅读全文。
类是程序员定义的新类型,所以我认为子类==子类型。
史蒂夫杰索普写道:
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;
}