Home > C++, Programming, Software Development > virtual จำเป็นหรือไม่สำหรับ Method ที่เป็นตัว Override ของคลาสที่สืบทอดไป

virtual จำเป็นหรือไม่สำหรับ Method ที่เป็นตัว Override ของคลาสที่สืบทอดไป

เวลา Override method คนส่วนมากมักจะใช้ virtual บน Method ที่เป็นตัว Override แบบด้านล่าง

class Root
{
public:
	Root()
	{
	}

	virtual ~Root()
	{
	}

	virtual void Bar()
	{
	}
};

class Foo : public Root
{
public:
	Foo()
	{
	}

	virtual ~Foo()
	{
	}

	virtual void Bar()
	{
	}
};

แต่ในความเป็นจริงแล้ว มันไม่มีความจำเป็นเลย Code ด้านล่างนี้ทำงานเหมือนกับ Code ข้างบน

class Root
{
public:
	Root()
	{
	}

	virtual ~Root()
	{
	}

	virtual void Bar()
	{
	}
};

class Foo : public Root
{
public:
	Foo()
	{
	}

	~Foo()
	{
	}

	void Bar()
	{
	}
};

และด้านล่างนี้คือ Code ตัวอย่างพร้อมผลลัพธ์การทำงาน

#include <stdio.h>

class Root
{
public:
	Root()
	{

	}

	virtual ~Root()
	{
		printf("In ~Root()\n");
	}

	virtual void Boo()
	{
		printf("In Root::Boo()\n");
	}

	virtual void Bee()
	{
		printf("In Root::Bee()\n");
	}
};

class Foo : public Root
{
public:
	Foo()
	{

	}

	~Foo()
	{
		printf("In ~Foo()\n");
	}

	void Boo()
	{
		printf("In Foo::Boo()\n");
	}

	virtual void Bee()
	{
		printf("In Foo::Bee()\n");
	}

	virtual void Bam()
	{
		printf("In Foo::Bam()\n");
	}
};

class Bar : public Foo
{
public:
	Bar()
	{

	}

	~Bar()
	{
		printf("In ~Bar()\n");
	}

	void Boo()
	{
		printf("In Bar::Boo()\n");
	}

	void Bam()
	{
		printf("In Bar::Bam()\n");
	}
};

int main(int argc, char *argv[])
{
	Foo *foo = new Bar();
	Root *root = foo;

	foo->Boo();
	foo->Bam();
	root->Bee();

	delete root;

	return 0;
}

ผลลัพธ์

In Bar::Boo()
In Bar::Bam()
In Foo::Bee()
In ~Bar()
In ~Foo()
In ~Root()

Advertisements
  1. 2012/02/15 at 9:42 AM

    ว่าง ๆ ไปเยี่มบลอกผมบ้างนะฮ่า ๆ http://soghband.exteen.com/

  2. 2012/02/22 at 11:05 PM

    อ้าว เดียวนี้มาสาย 3ds MAX แล้วเหรอ

  1. No trackbacks yet.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s