我不完全理解这个问题。请教怎么理解?
我目前对“抽象类”概念的理解是:
需要一个抽象类来禁止创建无法实现的实例。例如,有“词”的概念。这是一个抽象的概念。“词”概念的某些特征的细化已经可以实现。
例如:
#include <locale>
#include <iostream>
#include <string>
class word {
public:
std::string _meaning;
word() { _meaning = ""; }
virtual void show() = 0;
};
class english_word : public word {
public:
english_word() : word() { };
english_word(std::string meaning) { _meaning = meaning; }
virtual void show() override {
std::cout << _meaning << std::endl;
}
};
int main() {
setlocale(LC_ALL, "RU");
word *wrd;
english_word ewrd("Hello");
wrd = &ewrd; // 1
wrd->show();
ewrd.show(); // 2
system("pause");
return 0;
}
问题:
很多时候,在描述多态性时,我会遇到这样一个事实:“对后代类的引用可以分配给指向基类的指针”。但为什么 ?这也更困难.. //1 当您可以立即执行 //2 时,为什么还要执行?你能解释或建议我在哪里可以读到它吗?
这是一个简单的示例,直接来自您的层次结构。但首先,一个小题外话。
您的基类词定义了某个概念,或者抽象了某个实体。也就是说,单词类型为您的任务中的各种单词设置了一些非常一般的行为(一般含义)。此外,在您自己的任务框架内,有来自世界不同语言的单词的特征,因此,特别是,您创建另一种指定单词描述/行为的类型,即英语单词(英语单词类)。
继承是对某些基本概念/实体的行为的规范(澄清或更改)。
多态性与继承齐头并进。它允许您使用一种机制来处理通用类型或通用行为(即一组通用函数或接口)的对象。
我们可以创建一个通用机制来处理单词类型的所有子类型。关键是工作的一般机制!
例子。基本词类有一个 show() 方法,该方法对整个类层次结构(在您采用的抽象范围内)都是通用的。这种方法意味着在后代中,对于世界不同的语言,单词的显示会有所不同。
假设您有一些机制允许您调用此方法,而不管传递给它的是什么类型的单词(什么语言)。也就是说,这种机制将实现抽象词类中固有的多态性。
某处,在你浩瀚的程序中,有一个地方可以调用任何单词的show方法,而这个地方并不关心它执行的是哪种类型的单词(它不需要知道具体的类型,它只是对接口感兴趣,即声明的行为):
现在我们可以将任何对象传递给这个方法,任何 word 类型的后继者,不管这个类型现在是否存在,或者将来会被创建 - some_place_in_your_code 方法的行为不会改变。