Конструктор производного класса с базовым экземпляром в качестве параметра - PullRequest
0 голосов
/ 06 июля 2010

У меня есть этот код:

#include <stdio.h>

class A
{
public:
    A() { printf("A::A()\n"); }
    A(const A &a) { printf("A::A(A &a)\n"); }
    A &operator=(const A &a) { printf("A::operator=\n"); }
};

class B : public A
{
public:
    B() { printf("B:B()\n"); }
    B(const A &a) : A(a) { printf("B::B(A &a)\n"); }
    B &operator=(const B &b) { printf("B::operator=\n"); }
};

int
main(int argc, char *argv[])
{
    printf(">> B b1\n");
    B b1;
    printf(">> b2 = b1\n");
    B b2 = b1;
    return 0;
}

Почему строка B b2 = b1 не вызывает конструктор B::B(const A &a) и вместо этого вызывает A::A(const A &a)?Как я могу сказать компилятору сделать это?

Ответы [ 2 ]

5 голосов
/ 06 июля 2010

Потому что он вызывает B :: B (const B & a), что в свою очередь вызывает A :: A (const A & a). И вы пропустили B :: B (const B & a) в своем классе, поэтому вы не можете его видеть.

0 голосов
/ 06 июля 2010

Это потому, что:

Это:

B(const A &a)  
{ 
    printf("B::B(A &a)\n"); 
}

не является конструктором копирования!

Однако это:

B(const B &a)  
{ 
    printf("B::B(A &a)\n"); 
}

конструктор копирования.

С вашей версией конструктора копирования вы также разрушаете стек.

Чтобы доказать свою точку зрения на повреждение стека, вы должны попробовать это:

Обратите внимание, что он никогда не будет печатать "Inside B :: Print ()"

class A
{
public:
    A() { printf("A::A()\n"); }
    A(const A &a) 
    { 
        printf("A::A(A &a)\n"); 
    }
    A &operator=(const A &a) { printf("A::operator=\n"); }
    void print(){printf("Inside A::Print()\n"); }
};

class B : public A
{
public:
    B() { printf("B:B()\n"); }
    B(const A &a)  
    { 
        printf("B::B(A &a)\n"); 
    }
    B &operator=(const B &b) { printf("B::operator=\n"); }

    void print(){printf("Inside B::Print()\n");}
};

int main(int argc, char *argv[])
{
    printf(">> B b1\n");
    B b1;
    b1.print();
    printf(">> b2 = b1\n");
    B b2 = b1;
    b2.print();
    return 0;
}
...