Besides making blocks depend on one another, CBC also includes a randomization component: the first block is XORed with a random number/string called the initialization vector (also known as initial value). In particular, when we encrypt the same plaintext with two different initial values, we get totally different ciphertexts. After we get the result of the XOR, we plug it into the encryption function/table to get the ciphertext of the 1st block.
Then, to encrypt all the subsequent plaintext blocks, we XOR a block with the ciphertext of the previous block and then plug the XOR result into the encryption function/table.
The strengths of CBC are: (1) its relative speed and simplicity and (2) its great ability to hide patterns in text or images. These are two reasons that CBC is the most commonly used encryption mode.
Still, two weaknesses of CBC are that (1) encryption is not parallelized: the blocks must be encrypted sequentially, in a linear manner. Also, (2) CBC only encrypts data and provides confidentiality; it doesn't enforce authentication, so you can't confirm the identity of the sender of that data. Use an additional mechanism, e.g., digital signatures, to provide authentication.