C++之抽象基类与纯虚函数
生活随笔
收集整理的這篇文章主要介紹了
C++之抽象基类与纯虚函数
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
// Vitual_Base.cpp : Defines the entry point for the console application.
//抽象基類與純虛函數(shù)#include "stdafx.h"
#include<stdlib.h>
#include<iostream>using namespace std;class Point
{
private:double x, y;public:Point(double i, double j) :x(i), y(j)//使用參數(shù)列表{}void print()const //防止在函數(shù)體內(nèi)修改變量的值{cout << "( " << x << ", " <<y<<")"<< endl;}
};//聲明一個圖形類,作為其他類的基類
class Figure//組合類
{
private:Point center;
public:Figure(double i = 0, double j = 0) :center(i, j)//注意復(fù)合類初始化與繼承類初始化的異同{}Point & location()//為了避免拷貝,不產(chǎn)生臨時變量使用引用{return center;}void move(Point p){center = p;//改變圖形的中心點draw();//調(diào)用draw()函數(shù)對圖形重新繪制}//純虛函數(shù):虛函數(shù)只有聲明,沒有實現(xiàn),函數(shù)體=0virtual void draw() = 0;//繪制圖形,但不知道是什么圖形,因此并不知道他的具體實現(xiàn)virtual void rotate(double) = 0;//旋轉(zhuǎn)函數(shù),也沒有實現(xiàn)
};//聲明一個類。繼承于圖形類
class Circle :public Figure//派生類
{
private:double radius;
public:Circle(double i = 0, double j = 0, double r = 0) :Figure(i, j),radius(r){}void draw()//對父類Figure中的純虛函數(shù)進行實現(xiàn){cout << "A circle with center ";location().print();//打印圓的中心cout << " and radius " << radius << endl;}void rotate(double a)//旋轉(zhuǎn)一個圓,雖然沒有任何效果,但必須rotate()函數(shù)必須實現(xiàn){cout << " no effect.\n";}
};
//聲明一個正方形類,繼承于圖形類,與圓的實現(xiàn)基本類似
class Square :public Figure
{
private:double side;//邊長double angle;//與x軸的夾角
public:Square(double i = 0, double j = 0, double d = 0, double a = 0) :Figure(i, j) {side = d;angle = a;}void draw(){cout << "A square with center ";location().print();cout << " side length " << side << ".\n"<< " The angle between one side and the X-axis is " << angle << endl;}void rotate(double a){angle += a;cout << "The angle between one side and the X-axis is " << angle << endl;}//頂點數(shù)void vertices() { cout << "The Vertices of the square are: 3\n"; }
};int main()
{Circle c(1, 2, 3);Square s(4, 5, 6);Figure *f = &c;//父類指針指向子類對象Figure &g = s;Figure aFigure(10,10);//error不能構(gòu)造抽象類的對象f->draw();f->move(Point(2, 2));g.draw();//使用父類引用調(diào)用虛函數(shù)g.rotate(1);g.move(Point(1, 1));s.vertices();system("pause");return 0;
}
/*那么子類是不是必須實現(xiàn)基類中所有的純虛函數(shù)?
是:因為子類不實現(xiàn)所有的純虛函數(shù)子類依然是一個抽象類
不是:因為子類擁有了基類的函數(shù),但是純虛函數(shù)沒有實現(xiàn),因此子類必須實現(xiàn)才行
因此:
(1) 純虛函數(shù):虛函數(shù)只有聲明,函數(shù)體=0,就是一個純虛函數(shù),純虛函數(shù)沒有函數(shù)體
,不需要實現(xiàn),在子類里實現(xiàn)純虛函數(shù)的具體功能(2)抽象基類:擁有純虛函數(shù)的類叫抽象基類,抽象類只能作為基類,不能構(gòu)建對象,因
為抽象類中的純虛函數(shù)沒有函數(shù)體,即沒有實現(xiàn)部分(3)抽象類提供了不同子類對象的一個通用接口(4)純虛函數(shù)被定義在派生類中,如果派生類不重寫基類的純虛函數(shù),則派生類也是一個
抽象類
*/
總結(jié)
以上是生活随笔為你收集整理的C++之抽象基类与纯虚函数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++之虚析构函数
- 下一篇: C++之菱形继承的解决之道