以前所有的课程都有一个共同点--他们都是非面向对象的。现在你已经对这些概念的一个基本的处理,我们可以进行面向对象编程(OOP),其中真正的收益!
在传统的编程中,程序基本上是向计算机的指令列表,通过定义数据(通过变量),然后使用这些数据(通过语句和函数)。数据和工作在该数据的功能是单独的实体,这些实体结合在一起,以产生所需的结果。
那么什么是面向对象的编程呢?与许多事情一样,它也许是最容易理解的,通过使用一个比喻。看看你周围-你看起来都是对象。对象有两个主要成分:1)列出相关的特性(如重量、颜色、大小、硬度、形状等),和2)的一些行为,他们可以展示(例如被打开,使东西热,等..)。这些属性和行为是不可分割的。
因为阿拉伯国家和欧洲区域局是一个参照对象,这里的意图是使用虚拟函数来访问B::::getname2() getname1()和B。然而,因为B::getname1()采用不同的参数(short int型而不是int),这是不被认为是一个覆盖::getname1()。更可怕的是,因为B::::getname2()是const和getname2()不是,B:getname2()并不认为是一个覆盖::getname2()。
因此,这个程序打印:
一
一
在这种情况下,因为A和B只是他们的名字,看到我们搞砸了我们的覆盖是非常简单的,而错误的虚拟函数的调用。然而,在一个更复杂的程序,其中的功能有行为或返回值,不打印,这样的问题可能是非常困难的调试。
为了帮助解决要重写但不是功能问题,C++ 11介绍了重写说明符。重写可以放置在同一个地方,const说明符用于任何重写功能会。如果函数不重写基类函数,编译器将标记函数作为一个错误。
在传统的编程中,程序基本上是向计算机的指令列表,通过定义数据(通过变量),然后使用这些数据(通过语句和函数)。数据和工作在该数据的功能是单独的实体,这些实体结合在一起,以产生所需的结果。
那么什么是面向对象的编程呢?与许多事情一样,它也许是最容易理解的,通过使用一个比喻。看看你周围-你看起来都是对象。对象有两个主要成分:1)列出相关的特性(如重量、颜色、大小、硬度、形状等),和2)的一些行为,他们可以展示(例如被打开,使东西热,等..)。这些属性和行为是不可分割的。
与传统的编程,属性(数据)和行为(功能)是独立的实体,这意味着传统的编程往往不提供一个非常直观的现实代表。它是由程序员来管理和连接的属性以适当的方式的行为。
面向对象的编程也带来了一些其他有用的概念表:继承,封装,抽象和多态性(语言设计者有一个理念:永远不要使用一个小字,一个大的人会做的)。我们将在接下来的几章中,在即将到来的教程中覆盖所有这些概念。这是一个很大的新材料,但一旦你已经正确地了解OOP,你可能永远都不想回到传统的纯编程了。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class A
{
public:
virtual const char* getName1(int x) { return "A"; }
virtual const char* getName2(int x) { return "A"; }
};
class B : public A
{
public:
virtual const char* getName1(short int x) { return "B"; } // note: parameter is a short int
virtual const char* getName2(int x) const { return "B"; } // note: function is const
};
int main()
{
B b;
A &rBase = b;
std::cout << rBase.getName1(1) << '\n';
std::cout << rBase.getName2(2) << '\n';
return 0;
因为阿拉伯国家和欧洲区域局是一个参照对象,这里的意图是使用虚拟函数来访问B::::getname2() getname1()和B。然而,因为B::getname1()采用不同的参数(short int型而不是int),这是不被认为是一个覆盖::getname1()。更可怕的是,因为B::::getname2()是const和getname2()不是,B:getname2()并不认为是一个覆盖::getname2()。
因此,这个程序打印:
一
一
在这种情况下,因为A和B只是他们的名字,看到我们搞砸了我们的覆盖是非常简单的,而错误的虚拟函数的调用。然而,在一个更复杂的程序,其中的功能有行为或返回值,不打印,这样的问题可能是非常困难的调试。
为了帮助解决要重写但不是功能问题,C++ 11介绍了重写说明符。重写可以放置在同一个地方,const说明符用于任何重写功能会。如果函数不重写基类函数,编译器将标记函数作为一个错误。