Penimpaan Eksplisit (C++/CLI dan C++/CX)
Topik ini membahas cara mengesampingkan anggota kelas dasar atau antarmuka secara eksplisit. Penimpaan bernama (eksplisit) hanya boleh digunakan untuk mengambil alih metode dengan metode turunan yang memiliki nama yang berbeda.
Semua Runtime
Sintaks
overriding-function-declarator = type::function [,type::function] { overriding-function-definition }
overriding-function-declarator = function { overriding-function-definition }
Parameter
overriding-function-declarator
Jenis pengembalian, nama, dan daftar argumen fungsi penimpaan. Perhatikan bahwa fungsi penimpaan tidak harus memiliki nama yang sama dengan fungsi yang ditimpa.
jenis
Jenis dasar yang berisi fungsi yang akan diambil alih.
fungsi
Daftar yang dibatasi koma dari satu atau beberapa nama fungsi yang akan diambil alih.
overriding-function-definition
Pernyataan isi fungsi yang menentukan fungsi penimpaan.
Keterangan
Gunakan penimpaan eksplisit untuk membuat alias untuk tanda tangan metode, atau untuk memberikan implementasi yang berbeda untuk metode dengan tanda tangan yang sama.
Untuk informasi tentang mengubah perilaku jenis yang diwariskan dan anggota jenis yang diwariskan, lihat Mengambil alih Penentu.
Windows Runtime
Persyaratan
Opsi pengkompilasi: /ZW
Runtime Bahasa Umum
Keterangan
Untuk informasi tentang penimpaan eksplisit dalam kode asli atau kode yang dikompilasi dengan /clr:oldSyntax
, lihat Penimpaan Eksplisit.
Persyaratan
Opsi pengkompilasi: /clr
Contoh
Contoh kode berikut menunjukkan penimpaan dan implementasi anggota yang sederhana dan implisit dalam antarmuka dasar, tidak menggunakan penimpaan eksplisit.
// explicit_override_1.cpp
// compile with: /clr
interface struct I1 {
virtual void f();
};
ref class X : public I1 {
public:
virtual void f() {
System::Console::WriteLine("X::f override of I1::f");
}
};
int main() {
I1 ^ MyI = gcnew X;
MyI -> f();
}
X::f override of I1::f
Contoh kode berikut menunjukkan cara mengimplementasikan semua anggota antarmuka dengan tanda tangan umum, menggunakan sintaks penimpaan eksplisit.
// explicit_override_2.cpp
// compile with: /clr
interface struct I1 {
virtual void f();
};
interface struct I2 {
virtual void f();
};
ref struct X : public I1, I2 {
virtual void f() = I1::f, I2::f {
System::Console::WriteLine("X::f override of I1::f and I2::f");
}
};
int main() {
I1 ^ MyI = gcnew X;
I2 ^ MyI2 = gcnew X;
MyI -> f();
MyI2 -> f();
}
X::f override of I1::f and I2::f
X::f override of I1::f and I2::f
Contoh kode berikut menunjukkan bagaimana penimpaan fungsi dapat memiliki nama yang berbeda dari fungsi yang diterapkannya.
// explicit_override_3.cpp
// compile with: /clr
interface struct I1 {
virtual void f();
};
ref class X : public I1 {
public:
virtual void g() = I1::f {
System::Console::WriteLine("X::g");
}
};
int main() {
I1 ^ a = gcnew X;
a->f();
}
X::g
Contoh kode berikut menunjukkan implementasi antarmuka eksplisit yang mengimplementasikan jenis koleksi yang aman.
// explicit_override_4.cpp
// compile with: /clr /LD
using namespace System;
ref class R : ICloneable {
int X;
virtual Object^ C() sealed = ICloneable::Clone {
return this->Clone();
}
public:
R() : X(0) {}
R(int x) : X(x) {}
virtual R^ Clone() {
R^ r = gcnew R;
r->X = this->X;
return r;
}
};