Phương thức f()
của bạn vẫn bị ghi đè. Mối quan hệ này hữu ích khi triển khai mẫu thiết kế Template Method. Về cơ bản, bạn sẽ triển khai các bộ hoạt động chung trong lớp cơ sở. Các hoạt động của lớp cơ sở đó sau đó sẽ gọi một phương thức ảo, như là f()
của bạn. Nếu lớp dẫn xuất ghi đè f()
, các hoạt động của lớp cơ sở sẽ kết thúc gọi phiên bản có nguồn gốc là f()
. Điều này cho phép các lớp dẫn xuất để giữ cho thuật toán cơ sở giống nhau nhưng thay đổi hành vi cho phù hợp với nhu cầu của chúng. Dưới đây là một ví dụ nhỏ:
#include <iostream>
using namespace std;
class Base
{
public:
virtual void f() { cout<<"Base::f()" << endl; }
protected:
void base_foo() { f(); }
};
class DerivedOne: private Base
{
public:
void f() { cout << "Derived::f()" << endl;}
void foo() { base_foo(); }
};
class DerivedTwo: private Base
{
public:
void foo() { base_foo(); }
};
int main()
{
DerivedOne d1;
d1.foo();
DerivedTwo d2;
d2.foo();
}
Dưới đây là kết quả tại thời gian chạy:
$ ./a.out
Derived::f()
Base::f()
lớp Cả hai có nguồn gốc gọi hoạt động cùng một lớp cơ sở nhưng hành vi này là khác nhau cho mỗi lớp dẫn xuất.
Đó là một ví dụ điển hình khác. – Omnifarious
Trên thực tế, đó chỉ là một ví dụ điển hình. Tôi trả lời câu hỏi sai. Rất tiếc. :-) – Omnifarious