SORU
4 AĞUSTOS 2009, Salı


Nasıl C'un temel sınıf kurucularını ve atama operatörü kullanılır ?

Kurucular ve atama operatörü ile B sınıfı var.

class B
{
 public:
  B();
  B(const string & s);
  B(const B & b){(*this) = b;};
  B & operator= (const B & b);
 private:
  virtual void foo();
  // and other private member variables and functions
}

Sadece işlev foo geçersiz kılacak bir miras D sınıfı oluşturmak istiyorum(), ve başka hiçbir değişiklik gereklidir.

Ama D B olarak kopya Kurucu ve atama operatörü de dahil olmak üzere kurucular aynı şekilde, sahip olmak istiyorum

  D(const D & d){(*this) = d;};
  D & operator= (const D & d);

D hepsini yazmak zorunda mıyım, ya da B. kurucular ve operatör kullanmak için bir yolu var mı? Özellikle B özel üye değişkenleri erişmek için var çünkü atama operatörü yeniden yazmamak isterdim.

CEVAP
4 AĞUSTOS 2009, Salı


Açıkça yapıcılar ve atama operatörleri arayabilirsiniz:

class Base {
//...
public:
    Base(const Base&) { /*...*/ }
    Base& operator=(const Base&) { /*...*/ }
};

class Derived : public Base
{
    int additional_;
public:
    Derived(const Derived& d)
        : Base(d) // dispatch to base copy constructor
        , additional_(d.additional_)
    {
    }

    Derived& operator=(const Derived& d)
    {
        Base::operator=(d);
        additional_ = d.additional_;
        return *this;
    }
};

İlginç olan şey bu ise açıkça bu fonksiyonlar daha sonra, derleyici tarafından oluşturulan bu işlevleri kullanır) tanımlamak sormaman bile çalışır.

class ImplicitBase { 
    int value_; 
    // No operator=() defined
};

class Derived : public ImplicitBase {
    const char* name_;
public:
    Derived& operator=(const Derived& d)
    {
         ImplicitBase::operator=(d); // Call compiler generated operator=
         name_ = strdup(d.name_);
         return *this;
    }
};

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Hot For Nutrition

    Hot For Nutr

    26 ŞUBAT 2007
  • MofoHifi Records

    MofoHifi Rec

    15 HAZİRAN 2006
  • Rootjunky.com

    Rootjunky.co

    22 EKİM 2011