abstract classes 需要什么?为什么要通过其基础 class 访问派生的 classes 方法?在 C++ 中
What is the need of abstract classes ? Why access a derived classes method through its base class ? in C++
我是 C++ 面向对象编程的初学者。我正在研究 "Abstract Classes",示例代码是:
#include <iostream>
using namespace std;
class Enemy {
public:
virtual void attack() = 0;
};
class Ninja: public Enemy {
public:
void attack() {
cout << "Ninja!"<<endl;
}
};
class Monster: public Enemy {
public:
void attack() {
cout << "Monster!"<<endl;
}
};
int main()
{
Ninja n;
Monster m;
Enemy *e1 = &n;
Enemy *e2 = &m;
e1->attack();
e2->attack();
return 0;
}
我想理解的是为什么我不能直接使用派生的classes 的对象来直接访问带有“.”的派生的class 成员。运算符(有效,但不建议为什么?)。
像这样:
int main()
{
Ninja n;
Monster m;
Enemy *e1 = &n;
Enemy *e2 = &m;
//e1->attack();
//e2->attack();
n.attack();
m.attack();
return 0;
}
我知道在某些情况下我们需要通过基class来访问派生classes的成员(我认为这是所有程序员通常使用的),但我不知道这种情况在现实世界中的实现(为什么我们不能直接去,为什么要通过基指针class?)。
如果有人能澄清我的疑问,我会很高兴。
一组敌人(std::vector<Enemy*>
)可以有忍者和怪物。忍者合集只能有忍者,怪兽合集只能有怪兽
抽象基础class为子classes提供了一个通用接口来实现,但是抽象基础class的实例没有实际意义(否则你不会将基础 class 抽象化)。
其余部分已涵盖购买其他答案,但 "Why a pointer?" 已被忽略。
每个子classes 都有不同的内容和可能不同的大小。如果没有引用,程序就必须知道确切的大小才能分配存储空间。强制所有子 class 的大小相同是行不通的,因为这违背了 C++ 的意识形态,即只为你使用的东西付费,并且需要修改以前编译的代码(一个新模块添加了一个new subclass,所有现有模块也必须更改)。此外,基 class 没有合理的方法来了解其子 class 的详细信息(以及不应该这样做的许多原因),这包括了解大小。
有了参考,没有人关心大小或实现细节。如果对象是多态的(这是 probably a "v-table",但 C++ 不关心使用什么 voodoo,只要结果满足标准)。
我是 C++ 面向对象编程的初学者。我正在研究 "Abstract Classes",示例代码是:
#include <iostream>
using namespace std;
class Enemy {
public:
virtual void attack() = 0;
};
class Ninja: public Enemy {
public:
void attack() {
cout << "Ninja!"<<endl;
}
};
class Monster: public Enemy {
public:
void attack() {
cout << "Monster!"<<endl;
}
};
int main()
{
Ninja n;
Monster m;
Enemy *e1 = &n;
Enemy *e2 = &m;
e1->attack();
e2->attack();
return 0;
}
我想理解的是为什么我不能直接使用派生的classes 的对象来直接访问带有“.”的派生的class 成员。运算符(有效,但不建议为什么?)。
像这样:
int main()
{
Ninja n;
Monster m;
Enemy *e1 = &n;
Enemy *e2 = &m;
//e1->attack();
//e2->attack();
n.attack();
m.attack();
return 0;
}
我知道在某些情况下我们需要通过基class来访问派生classes的成员(我认为这是所有程序员通常使用的),但我不知道这种情况在现实世界中的实现(为什么我们不能直接去,为什么要通过基指针class?)。
如果有人能澄清我的疑问,我会很高兴。
一组敌人(std::vector<Enemy*>
)可以有忍者和怪物。忍者合集只能有忍者,怪兽合集只能有怪兽
抽象基础class为子classes提供了一个通用接口来实现,但是抽象基础class的实例没有实际意义(否则你不会将基础 class 抽象化)。
其余部分已涵盖购买其他答案,但 "Why a pointer?" 已被忽略。
每个子classes 都有不同的内容和可能不同的大小。如果没有引用,程序就必须知道确切的大小才能分配存储空间。强制所有子 class 的大小相同是行不通的,因为这违背了 C++ 的意识形态,即只为你使用的东西付费,并且需要修改以前编译的代码(一个新模块添加了一个new subclass,所有现有模块也必须更改)。此外,基 class 没有合理的方法来了解其子 class 的详细信息(以及不应该这样做的许多原因),这包括了解大小。
有了参考,没有人关心大小或实现细节。如果对象是多态的(这是 probably a "v-table",但 C++ 不关心使用什么 voodoo,只要结果满足标准)。