荒屋敷智也のブログ

【C++備忘録】Visual Studio2022 仮想関数

当ブログではアフィリエイト広告を利用しています

仮想関数

親クラスで子クラスを呼ぶためのもの
virtualをつけると仮想になる。

bird.h

#pragma once

#include <iostream>
#include <string>

using namespace std;

class CBird {
public:
	virtual void sing() { cout << "鳥が鳴きます" << endl; };
	void fly() { cout << "鳥が飛びます" << endl; };
};

CChiecken.h

#pragma once
#include "bird.h"

class CChicken:public CBird {
public:
	void sing() { cout << "コケコッコー" << endl; };
	void fly() { cout << "にわとりは飛べません" << endl; };
};

main.cpp

#include <iostream>
#include "bird.h"
#include "CChicken.h"

using namespace std;

int main()
{
	CBird *bird = 0;
	bird = new CBird();

	bird->sing();
	bird->fly();

	//オーバーライド
	CChicken* chicken = 0;
	chicken = new CChicken();
	chicken->sing();
	chicken->fly();

	//CBirdでCChickenクラスを呼ぶ
	CBird* bird_checken = 0;
	bird_checken = new CChicken();
	bird_checken->sing();
	bird_checken->fly();
}

純粋仮想関数、抽象クラス、仮想デストラク

抽象クラスの場合、仮想デストラクタでないとデストラクタが呼ばれないようなですね。

sup1.h

#pragma once
#include <iostream>

using namespace std;

//純粋仮想関数があるクラスを抽象クラスという
class Csup1 {
public:
	Csup1() { cout << "CCsup1のコンストラクタ" << endl; };

	//純粋仮想関数
	virtual void test()=0;

	//抽象クラスの場合、virtualをつけないとデストラクタが呼ばれない
	virtual ~Csup1() { cout << "CCsup1のデストラクタ" << endl; };
};

sub1.h

#pragma once
#include "sup1.h"

class Csub1:public Csup1 {
public:
	Csub1() { cout << "CCsub1のコンストラクタ" << endl; };
	void test(){ cout << "sub1のテスト関数" << endl; };
	~Csub1() { cout << "CCsub1のデストラクタ" << endl; };
};

main.cpp

#include <iostream>
#include "sup1.h"
#include "sub1.h"

using namespace std;

int main()
{
	Csup1* s1 = new Csub1();
	s1->test();
	delete s1;
}