2016-03-20 14 views
2

ben değiştiremem varolan bir sınıfın A olmayan sanal yöntemleri eklemek istiyorum. Bu nedenle, A'dan miras alınan bir sınıf B oluşturun ve istediğim yöntemleri ekleyin. Ben tip A bir nesne varsa Şimdi, ben sadece tip B bir nesne olarak kabul edilebilir? Say, ancak beklendiği gibi çalışmaya standardı tarafından garanti olmadığını merak yasal Aşağıdaki kod ?:C++ 'da, yalnızca sanal olmayan yöntemler ekleyen türetilmiş bir sınıfa yayınlanmasına izin verilir mi?

class A { <...> }; 

class B: public A { 
    void f(); 
    }; 

A a(); 
void g(const B&); 
void h() { g(static_cast<B&&>(a())); } 

Bu derlemek ve çalışma yapmasıdır. Nedenini göremiyorum, henüz çok temiz değil ..

+0

Hayır, oyuncu, tanımlanmamış davranışa neden oluyor –

+0

Ancak "B a;", ardından bir void foo (A & a);) 'de olduğu gibi bir' A & 'argümanı olarak alan bir işleve yapılan bir çağrının ardından tanımlanmış: 'foo (a)' öyle ki iç foo, gerçekten a' gerçekten 'b' olduğunu' biliyoruz (ama nasıl olur?), sen döküm yapabilirsiniz –

+0

bir nesneyi döküm istiyoruz Neden eğer. – MikeMB

cevap

5

Bu tanımlanmamış bir davranış. [expr.static.cast] kaynaktan:

B, D B sınıfı türetilmiş (Madde 10), “cv2 D referans” tip dökülebilir bir sınıf türü olan “CV1 B”, bir lvalue "İşaretçiden D" ye "İmleci" olarak geçerli bir standart dönüşüm varsa (4.10), cv2, cv1 ile aynı cv-niteliği veya daha büyük cv-nitelemesidir, ve B de bir sanal taban sınıfıdır D'nin veya bir D alt sınıfı temel sınıfı. Sonuç “cv2 D” türüne sahiptir. “Cv1 B” tipindeki bir xvalue, “cv1 B” tipindeki bir değer için olduğu gibi aynı kısıtlamalarla “cv2 D'ye rvalue reference” yazmak için dökülebilir. “cv1 B” türü nesnesi aslında D türünde bir nesnenin bir alt nesnesiyse, sonuç D türünde nesnesini gösterir. Aksi halde, davranış tanımsızdır. gerçekten sadece tip A ait, yani davranış tanımlanmamıştır -

a aslında tip B bir nesnenin bir suboject değildir.

Ne basitçe üye olmayan bir fonksiyonu ekleyerek sizi durdurmaya açıklanmıştır: cevabı, A ait private veya protected üye erişmesi gereken ise

void f(A&); 

, ardından bu üyeler unaccessible yapmak için niyet yoktu sen!

+0

Hiçbir şey beni durduruyor, sadece global bir fonksiyon kullanarak OOP'un avantajlarından birini kaybederim. Çok kötü C++ bu problemi çözmez. YaronCohen-Tal @ –

+1

OOP dezavantajlarından biri keşfedilen gibi benim için daha geliyor. – Barry

+0

Hehe, evet, belki ... İşte bu, C'ye geçiyorum! j.k ... –