Tính đa hình trong cơ sở dữ liệu - Pdf 13

Chương 9 Tính đa hình


Con trỏ và Lớp dẫn xuất


Dẫn nhập các hàm ảo


Các hàm ảo thuần túy


Áp dụng đa hình



Cơ sở của hàm ảo và đa hình khi thực thi chương trình là các con trỏ của lớp
dẫn xuất.

Chương 3 có khảo sát về con trỏ, một đặc tính mới của con trỏ sẽ được khảo sát
trong chương này.
Nếu p là một con trỏ tới lớp cơ sở, thì có thể sử dụng p để trỏ tới
bất kỳ lớp nào được suy ra từ lớp cơ sở
.

Chẳng hạn, có hai lớp cơ sở
base
và lớp dẫn xuất
derived
kế thừa base, các phát biểu
sau đều đúng

base *p; // base class pointer

base base_ob; // object of type base
derived derived_ob; // object of type derived

// p can, of course, point to base objects
p =
&
base_ob; // p points to base object

// p can also point to derived objects without error
p =

. Ví dụ 1.1
Dùng con trỏ của lớp cơ sở để truy cập đến lớp dẫn xuất.

// Demonstrate pointer to derived class.
#include <iostream.h>

class base {
int x;
public:
void setx(int i) { x = i; }
int getx() { return x; }
};

class derived :
public
base {
int y;
public:
void sety(int i) { y = i; }
int gety() { return y; }
};

int main()
{
base *p; // pointer to base type
base b_ob; // object of base
derived d_ob; // object of derived


1/ Khái niệm
Hàm ảo
là hàm thành phần của một lớp, nó được khai báo ở lớp cơ sở và được đònh
nghiã lại trong lớp dẫn xuất.

Khai báo hàm ảo bắt đầu bằng từ khoá
virtual
. Một lớp có chứa hàm ảo được kế
thừa, lớp dẫn xuất sẽ tái đònh nghiã hàm ảo đó cho chính mình.


Các hàm ảo triển khai ý tưởng chủ đạo của đa hình là "
một giao diện cho nhiều
phương thức
". Hàm ảo bên trong một lớp cơ sở
đònh nghiã hình thức giao tiếp
đối
với hàm đó.

Việc tái đònh của hàm ảo ở lớp dẫn xuất là
thi hành các tác vụ của hàm liên quan đến
chính lớp dẫn xuất đó
. Nói cách khác, tái đònh các hàm ảo chính là tạo ra các phương
thức cụ thể. Hàm ảo tái đònh ở lớp dẫn xuất không cần sử dụng từ khoá virtual.



public:
int i;
base(int x) { i = x; }

virtual
void
func()

{
cout << "Using base version of func(): ";
cout << i << '\n';
}
};

class derived1 :
public
base {
public:
derived1(int x) :
base(x)
{}
void
func()

{
cout << "Using derived1's version of func(): ";
cout << i
*
i << '\n';
}

derived1 d_ob1(10);
derived2 d_ob2(10);

p = &ob;

p->func()
; // use base's func()

p = &d_ob1;

p->func()
; // use derived1's func()

p = &d_ob2;

p->func()
; // use derived2's func()

return 0;
}

@ Kiểu của đối tượng được trỏ đến sẽ xác đònh phiên bản nào của hàm ảo được thực
thi thông qua cách gọi hàm bằng con trỏ. Điều này chỉ xác đònh được trong lúc run-
time. 2/ Hàm ảo và quá tải hàm
Giải thích kết qủa chương trình ?

Using base version of func() : 10

Ví dụ 2.2
// Virtual functions are hierarchical.
#include <iostream.h>

class
base
{
public:
int i;
base(int x) { i = x; }

virtual void func()

{
cout << "Using base version of func(): ";
cout << i << '\n';
}
};

class
derived1
:
public
base {
public:
derived1(int x) : base(x) {}

void func()
Chương 9
Tính đa hình


p = &d_ob1;
p->func(); // use derived1's func() p = &d_ob2;

p->func()
; // use base's func()

return 0;
} 4/ Cách đáp ứng của hàm ảo đối với một biến cố ngẫu nhiên ở thời điểm run-
time

Ví dụ 2.3
// This example illustrates how a virtual function can be used to respond to random
// events occurring at run time.
Kết qủa chương trình

Using base version of func() : 10
Using derived1's version of func() : 100
Using base version of func() : 10
Chöông 9
Tính ña hình277

}
};

class
derived2
:
public
base {
public:
derived2(int x) : base(x) {}
void func()
{
cout << "Using derived2's version of func(): ";
cout << i+i << '\n';
}
};
int main()
Chương 9
Tính đa hình278

{
base *p;
derived1 d_ob1(10);
derived2 d_ob2(10);

}


Nhờ tải bản gốc

Tài liệu, ebook tham khảo khác

Music ♫

Copyright: Tài liệu đại học © DMCA.com Protection Status