RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 966639
Accepted
Григорий
Григорий
Asked:2020-04-07 22:11:59 +0000 UTC2020-04-07 22:11:59 +0000 UTC 2020-04-07 22:11:59 +0000 UTC

为什么我们需要一个指向抽象类的指针?

  • 772

我不完全理解这个问题。请教怎么理解?

我目前对“抽象类”概念的理解是:

需要一个抽象类来禁止创建无法实现的实例。例如,有“词”的概念。这是一个抽象的概念。“词”概念的某些特征的细化已经可以实现。

例如:

#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 时,为什么还要执行?你能解释或建议我在哪里可以读到它吗?

c++
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    Alexander Chernin
    2020-04-07T23:30:48Z2020-04-07T23:30:48Z

    这是一个简单的示例,直接来自您的层次结构。但首先,一个小题外话。

    您的基类词定义了某个概念,或者抽象了某个实体。也就是说,单词类型为您的任务中的各种单词设置了一些非常一般的行为(一般含义)。此外,在您自己的任务框架内,有来自世界不同语言的单词的特征,因此,特别是,您创建另一种指定单词描述/行为的类型,即英语单词(英语单词类)。

    继承是对某些基本概念/实体的行为的规范(澄清或更改)。

    多态性与继承齐头并进。它允许您使用一种机制来处理通用类型或通用行为(即一组通用函数或接口)的对象。

    我们可以创建一个通用机制来处理单词类型的所有子类型。关键是工作的一般机制!

    例子。基本词类有一个 show() 方法,该方法对整个类层次结构(在您采用的抽象范围内)都是通用的。这种方法意味着在后代中,对于世界不同的语言,单词的显示会有所不同。

    假设您有一些机制允许您调用此方法,而不管传递给它的是什么类型的单词(什么语言)。也就是说,这种机制将实现抽象词类中固有的多态性。

    某处,在你浩瀚的程序中,有一个地方可以调用任何单词的show方法,而这个地方并不关心它执行的是哪种类型的单词(它不需要知道具体的类型,它只是对接口感兴趣,即声明的行为):

    void some_place_in_your_code(word* _a_word)
    {
        _a_word->show();
    }
    

    现在我们可以将任何对象传递给这个方法,任何 word 类型的后继者,不管这个类型现在是否存在,或者将来会被创建 - some_place_in_your_code 方法的行为不会改变。

    some_place_in_your_code( new russian_word() );
    some_place_in_your_code( new english_word() );
    
    //... 
    some_place_in_your_code( new rohirric_word() ); 
    //... 
    
    some_place_in_your_code( new lingua_incognita_word() );
    
    • 6

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    根据浏览器窗口的大小调整背景图案的大小

    • 2 个回答
  • Marko Smith

    理解for循环的执行逻辑

    • 1 个回答
  • Marko Smith

    复制动态数组时出错(C++)

    • 1 个回答
  • Marko Smith

    Or and If,elif,else 构造[重复]

    • 1 个回答
  • Marko Smith

    如何构建支持 x64 的 APK

    • 1 个回答
  • Marko Smith

    如何使按钮的输入宽度?

    • 2 个回答
  • Marko Smith

    如何显示对象变量的名称?

    • 3 个回答
  • Marko Smith

    如何循环一个函数?

    • 1 个回答
  • Marko Smith

    LOWORD 宏有什么作用?

    • 2 个回答
  • Marko Smith

    从字符串的开头删除直到并包括一个字符

    • 2 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5