輝々凛々

ガンバるってことは、素晴らしい事だ。

無闇なオーバーライドは禁止。

「Aクラスを継承したBクラスが、Aの関数をオーバーライドする」

って便利だけど、気持ち悪くないですか。たとえば、以下のようなオーバーライドします。

#include <iostream>

class A
{
public:
	virtual ~A() {}
	int foo()
	{
		return bar();
	}

	virtual int bar() { return 1; }
};

class B : public A
{
public:
	virtual ~B() {}
	virtual int bar() { return 2; }
};

int main()
{
	A a;
	std::cout << a.foo() << std::endl;

	B b;
	std::cout << b.foo() << std::endl;
	return 0;
}

これってさ、すっげー気持ち悪くないですか?

main関数のb.foo()コールは、Bの親クラスのA::foo()を呼んで、A::foo()内で、B::bar()に入るんで、結果は2になります。この流れの中で、A::foo()からB::bar()関数をコールしちゃう部分、スンゴイ気持ち悪いですよ。

なんか、モジュールとしてはAの方が下位モジュールだと思っていたのに、Bが下位モジュールになっちゃうんですよね。(下位モジュール=呼び出される側)

いやまぁ、便利なときもあるんですけど、オーバーライドって無闇にやるもんじゃないっすね。

関連記事

ツッコミの投稿


(ツッコミ非公開の場合はチェック)