- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我对面向对象的范式还是有点陌生,因此关于 OOP 的一件事让我心神不宁。这听起来像是一个天真的问题,答案很明显,而且很可能是一个问题,但以下两种情况之间有什么区别:
案例一:
class A
{
public:
A() = default;
A(int i) : data_point(i) {};
virtual int process_data_point();
protected:
int data_point=0;
};
class B : public A
{
public:
int process_data_point() override;
};
案例二:
class A
{
int data_point=0;
public:
A() = default;
A(int i) : data_point(i) {};
int process_data_point();
};
class B
{
public:
A process_data_point_in_a_different_way();
A data_point
};
我的意思是,我知道案例 1 涉及继承,它符合 OOP 的精神,但我无法逃避这样一种感觉,即人们也可以通过获取基类并定义包含数据成员的新类来模拟继承基类,具有一些附加功能(如案例 2 中所述)。我知道从长远来看模拟继承可能会变得过于复杂(特别是如果最终从数据成员类中获得一些不需要的功能),但我希望对于一些简单的情况,继承模拟工作得很好。
有人可以更详细地说明这一点吗?关于仿真的想法本质上是不好的,还是在某些情况下有意义?
最佳答案
差异 1
在“继承”主题下还有另一个主题称为“多态性”——以相同方式关联不同对象的能力。当你使用继承的方式时,你可以做一个接口(interface)类,以后在多态的情况下使用。快速浏览一下这段代码:
class BaseClass {
public:
virtual void action() = 0;
};
class A : public BaseClass {
public:
void action() {
cout << "A class" << endl;
}
};
class B : public BaseClass {
public:
void action() {
cout << "B class" << endl;
}
};
在这种情况下,我们有 3 个类。包含抽象函数“action”和两个继承类的基类。以下“main”函数展示了如何以多态方式使用它们:
int main() {
A a;
B b;
vector<BaseClass*> all = vector<BaseClass*>();
all.push_back(&a);
all.push_back(&b);
for (size_t i = 0; i < all.size(); i++) {
all[i]->action();
}
}
输出将是:
A class
B class
但是你看,我没有调用 a.action()
或 b.action()
- 我在循环中调用了它们 all[i ]-> Action ()
。没有继承就无法做到这一点。
差异 2
类中的“ protected ”特权仅授予类本身和继承类的访问权限。让我们看另一个例子:
class BaseClass {
private:
void private_method() {
cout << "Base class private method" << endl;
}
protected:
void protected_method() {
cout << "Base class protected method" << endl;
}
public:
void public_method() {
cout << "Base class public method" << endl;
}
};
假设我们有这个类,它包括private_method
、protected_method
和public_method
。现在我们有两个不同的类。继承BaseClass的A类和包含BaseClass的B类。让我们看看我们可以在每个类中使用哪些方法:
class A : public BaseClass {
public:
void test_privileges() {
//this->private_method(); // Compilation error!
this->protected_method();
this->public_method();
}
};
class B {
private:
BaseClass bc;
public:
void test_privileges() {
//bc.private_method(); // Compilation error!
//bc.protected_method(); // Compilation error!
bc.public_method();
}
};
如您所见,继承类和包含类之间存在保护差异。
差异 3
当你设计代码时,你希望它对每个人都尽可能清楚。为此,您必须在代码中保持逻辑流程。继承一个类和包含它在逻辑上是不同的。当你继承一个类时,你可以说继承人类是继承类,例如:
class Animal {};
class Dog : public Animal {};
class Cat : public Animal {};
Dog 是一种 Animal -> 所以 Dog 类必须继承 Animal 类。当你将一个类包含在另一个类中时,你可以说:The contains class have the includes class,例如:
class Tail {};
class Eye {};
class Dog {
private:
Tail tail;
Eye eye;
};
狗有尾部。 -> 所以 Dog 类包含 Tail 类。狗有眼睛。 -> 所以 Dog 类包含 Eye 类。
关于c++ - 拥有类继承和拥有基类作为派生类中的数据成员之间有明显的区别吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50757297/
平时很少在jquery中用到this。查看代码时发现用到了,就调试出this的值,心想原来如此。还是挺有用的。这里总结一下this与$(this)的区别和使用。 $(this)生成的是什么?
使用单例类和应用程序范围的托管 bean 来保存应用程序数据有区别吗? 我需要查找某些 JNDI 资源,例如远程 bean 接口(interface),因此我为自己编写了一个单例来缓存我的引用并且只允
如果您仔细查看包含的图片,您会注意到您可以使用 Eclipse IDE 重构 Groovy 代码并将方法转换为闭包,反之亦然。那么,闭包到底是什么,它与方法有什么不同呢?有人可以举一个使用闭包的好例子
vagrant box repackage有什么区别( docs ) 和 vagrant package ( docs )? 我意识到 vagrant package仅适用于 VirtualBox 提
我想看看是否有人可以解释为什么以下代码适用于 valueOf 但不适用于其他代码。 import java.math.BigDecimal; public class Change { publ
这个问题已经有答案了: 已关闭12 年前。 Possible Duplicates: What is Closures/Lambda in PHP or Javascript in layman te
This question already has answers here: Vagrant, Docker, Puppet, Chef (3个答案) 2年前关闭。 docker和chef有什么共同
以下代码在95%的机器上产生相同的输出,但是在几台机器上却有所不同。在 Debug模式下,输出: Changing from New to Fin OK 但在 Release模式下: Changing
////Creating Object var Obj; // init Object Obj= {}; 它们之间有什么区别两个? 有没有可能把它变成一个单行? 这样使用有什么好处吗?
我想找出定时器服务之间的区别。我应该使用哪个以及何时使用。我正在使用 Jboss 应用服务器。 1) java.ejb.Schedule。 @Schedule注解或配置自xml。 2) javax.e
我发现在 C++ 中可以通过三种不同的方式将对象传递给函数。假设我的类(class)是这样的: class Test { int i; public: Test(int x);
有什么区别。 public class Test { public static void main(String args[]) { String toBeCast = "c
如果我有一列,设置为主索引,设置为INT。 如果我不将其设置为自动递增,而只是将唯一的随机整数插入其中,与自动递增相比,这是否会减慢 future 的查询速度? 如果我在主索引和唯一索引为 INT 的
这两种日期格式有什么区别。第一个给出实际时间,第二个给出时间购买添加时区偏移值。 NSDateFormatter * dateFormatter = [[NSDateFormatter alloc]
如果有一个函数,请说foo: function foo() { console.log('bar'); } 那么在 JavaScript 中,从另一个函数调用一个函数有什么区别,如下所示: f
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 4 年前。 Improv
代码是什么: class Time { private: int hours; int minutes; int seconds; pu
我知道这是非常基本的,但有人介意解释一下这两个数组声明之间的区别吗: #include array myints; ...和: int myints[5]; ...以及为什么 myints.size
我学会了如何根据 http://reference.sitepoint.com/css/specificity 计算 css 特异性但是,基于this reference,我不明白伪类(来自c)和伪元
为什么在运行 2) 时会出现额外的空行?对我来说 1 就像 2。那么为什么 2) 中的额外行? 1) export p1=$(cd $(dirname $0) && pwd) #
我是一名优秀的程序员,十分优秀!