SORU
20 AĞUSTOS 2010, Cuma


Sanal fonksiyonlar parametre alabilir?

Eğer ilan ediyorum bir temel sınıf (veya arayüz sınıfı) ve varsayılan değeri belirtmek için bir veya daha fazla parametre, türetilmiş sınıfları belirtmek için aynı varsayılan değilse varsayılan olarak tezahür eder bu türetilmiş sınıfları?

Ek: ayrıca bu farklı Derleyiciler arasında ele olabilir nasıl ilgileniyorum ve herhangi bir giriş üzerinde "" bu senaryoda uygulama. tavsiye

CEVAP
20 AĞUSTOS 2010, Cuma


Sanal olanı varsayılan ayarlar olabilir. Temel sınıfın varsayılan türetilmiş sınıflar tarafından miras alınmaz.

Varsayılan -- yani, temel sınıf veya türetilmiş bir sınıf' -- statik türü işlevi çağrısı yapmak için kullanılan tarafından belirlenir. Eğer temel sınıf bir nesne, gösterici ya da referans ile arama yaparsanız, varsayılan temel sınıf olarak ifade kullanılır. Eğer türetilmiş bir sınıf bir nesne, gösterici ya da referans yoluyla ararsan tersine, varsayılan türetilmiş bir sınıf içinde ifade kullanılır. Bu gösteren Standart tırnak altında bir örnek yoktur.

Bazı Derleyiciler farklı bir şey yapmak olabilir, ama bu C 03 C 11 Standartlar şöyle der:

(EDİT: C 11 Standart aynı şeyi söylüyor

8.3.6.10:

Sanal işlev çağrısı (10.3) kullanır bu varsayılan bağımsız değişkenleri sanal işlevin bildirimi kararlı işaretçi veya başvuru statik tip nesne gösteren tarafından. Bir geçersiz kılan bir türetilmiş fonksiyonu sınıf işlevi varsayılan argümanlar elde değil geçersiz kılar. [Örnek:

struct A {
  virtual void f(int a = 7);
};
struct B : public A {
  void f(int a);
};
void m()
{
  B* pb = new B;
  A* pa = pb;
  pa->f(); //OK, calls pa->B::f(7)
  pb->f(); //error: wrong number of arguments for B::f()
}
—end example]

EditBurada varsayılan aldım ne göstermek için örnek bir program. Sadece kısaltma -- classstructclass yerine burada es kullanıyorum ve struct tam olarak varsayılan görünürlük hariç hemen hemen her şekilde aynıdır.

#include <string>
#include <sstream>
#include <iostream>
#include <iomanip>

using std::stringstream;
using std::string;
using std::cout;
using std::endl;

struct Base { virtual string Speak(int n = 42); };
struct Der : public Base { string Speak(int n = 84); };

string Base::Speak(int n) 
{ 
    stringstream ss;
    ss << "Base " << n;
    return ss.str();
}

string Der::Speak(int n)
{
    stringstream ss;
    ss << "Der " << n;
    return ss.str();
}

int main()
{
    Base b1;
    Der d1;

    Base *pb1 = &b1, *pb2 = &d1;
    Der *pd1 = &d1;
    cout << pb1->Speak() << "\n"    // Base 42
        << pb2->Speak() << "\n"     // Der 42
        << pd1->Speak() << "\n"     // Der 84
        << endl;
}

Bu programın çıktısı (MSVC10 ve GCC 4.4)

Base 42
Der 42
Der 84

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Carlos Delgado

    Carlos Delga

    21 HAZİRAN 2011
  • Cristina Landa

    Cristina Lan

    28 Ocak 2010
  • jeffisthecoolguy

    jeffisthecoo

    17 HAZİRAN 2013