1. Trang chủ
  2. » Công Nghệ Thông Tin

Các lớp cơ sở ảo

2 414 0
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Các Lớp Cơ Sở Ảo
Trường học Trường Đại Học Công Nghệ Thông Tin
Chuyên ngành Công Nghệ Phần Mềm
Thể loại Bài Giảng
Thành phố Thành Phố Hồ Chí Minh
Định dạng
Số trang 2
Dung lượng 11,95 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Một lớp cơ sở xuất hiện nhiều lần trong lớp dẫn xuất Một điều hiển nhiên là không thể khai báo 2 lần cùng một lớp trong danh sách của các lớp cơ sở cho một lớp dẫn xuất.. Chẳng hạn ví dụ

Trang 1

Các lớp cơ sở ảo 5.1 Một lớp cơ sở xuất hiện nhiều lần trong lớp dẫn xuất

Một điều hiển nhiên là không thể khai báo 2 lần cùng một lớp trong danh sách của các lớp

cơ sở cho một lớp dẫn xuất Chẳng hạn ví dụ sau là không cho phép:

class B : public A, public A

{

} ;

Tuy nhiên vẫn có thể có trường hợp cùng một lớp cơ sở được đề cập nhiều hơn một lần trong các lớp cơ sở trung gian của một lớp dẫn xuất Ví dụ:

#include <iostream.h>

class A

{

public:

int a;

} ;

class B : public A

{

public:

int b;

} ;

class C : public A

{

public:

int c;

} ;

class D : public B , public C

{

public:

int d;

} ;

void main()

{

D h ;

h.d = 4 ; // tốt

h.c = 3 ; // tốt

h.b = 2 ; // tốt

h.a = 1 ; // lỗi

}

Trang 2

Trong ví dụ này A là cơ sở cho cả 2 lớp cơ sở trực tiếp của D là B và C Nói cách khác có 2 lớp cơ sở A cho lớp D Vì vậy trong câu lệnh:

h.a = 1 ;

thì Chương trình dịch C++ không thể nhận biết được thuộc tính a thừa kế thông qua B hay thông qua C và nó sẽ đưa ra thông báo lỗi sau:

Member is ambiguous: ‘A::a’ and ‘A::a’

5.2 Các lớp cơ sở ảo

Giải pháp cho vấn đề nói trên là khai báo A như một lớp cơ sở kiểu virtual cho cả B và C Khi đó B và C được định nghĩa như sau:

class B : virtual public A

{

public:

int b;

} ;

class C : virtual public A

{

public:

int c;

} ;

Các lớp cơ sở ảo (virtual) sẽ được kết hợp để tạo một lớp cơ sở duy nhất cho bất kỳ lớp nào dẫn xuất từ chúng Trong ví dụ trên, hai lớp cơ sở A ( A là cơ sở của B và A là cơ sở của C) sẽ kết hợp lại để trở thành một lớp cơ sở A duy nhất cho bất kỳ lớp dẫn xuất nào từ B và C Như vậy bây giờ D sẽ chỉ có một lớp cơ sở A duy nhất, do đó phép gán:

h.a = 1 ;

sẽ gán 1 cho thuộc tính a của lớp cơ sở A duy nhất mà D kế thừa

Ngày đăng: 24/10/2013, 15:20

TỪ KHÓA LIÊN QUAN

w